Подтвердить что ты не робот

Чтение строк по номеру из большого файла

У меня есть файл с 15 миллионами строк (не помещается в память). У меня также есть маленький вектор номеров строк - строки, которые я хочу извлечь.

Как я могу считывать строки за один проход?

Я надеялся на функцию C, которая делает это за один проход.

4b9b3361

Ответ 1

Фокус в том, чтобы использовать соединение и открыть его перед read.table:

con<-file('filename')
open(con)

read.table(con,skip=5,nrow=1) #6-th line
read.table(con,skip=20,nrow=1) #27-th line
...
close(con)

Вы также можете попробовать scan, это быстрее и дает больше контроля.

Ответ 2

Если это двоичный файл

Некоторые обсуждения здесь: Чтение только части файла Stata.DTA в R

Если это CSV или другой текстовый файл

Если они смежны и находятся в верхней части файла, просто используйте аргумент ,nrows для read.csv или любого семейства read.table. Если нет, вы можете объединить аргументы ,nrows и ,skip, чтобы повторно вызвать read.csv (чтение в новой строке или группе смежных строк с каждым вызовом), а затем rbind результаты вместе.

Ответ 3

Если ваш файл имеет фиксированную длину строки, вы можете использовать "искать", чтобы перейти к любой позиции символа. Поэтому просто перейдите к N * line_length для каждого нужного вам N и прочитайте одну строку.

Однако из документов R:

 Use of seek on Windows is discouraged.  We have found so many
 errors in the Windows implementation of file positioning that
 users are advised to use it only at their own risk, and asked not
 to waste the R developers' time with bug reports on Windows'
 deficiencies.

Вы также можете использовать "искать" из стандартной библиотеки C в C, но я не знаю, применимо ли это предупреждение!

Ответ 4

Прежде чем я смог получить решение/ответ R, я сделал это в Ruby:

#!/usr/bin/env ruby

NUM_SEQS = 14024829

linenumbers = (1..10).collect{(rand * NUM_SEQS).to_i}

File.open("./data/uniprot_2011_02.tab") do |f|
  while line = f.gets
    print line if linenumbers.include? f.lineno 
  end
end

работает быстро (так же быстро, как мое хранилище может прочитать файл).

Ответ 5

Я компилирую решение на основе обсуждений здесь.

scan(filename,what=list(NULL),sep='\n',blank.lines.skip = F)

Это покажет только количество строк, но ничего не будет читать. Если вы действительно хотите пропустить пустые строки, вы можете просто установить для последнего аргумента значение TRUE.

Ответ 6

Если он только читает текстовый файл вообще

cat(readLines("filename.txt", n=10), sep="\n")

где параметр sep предназначен для установки символа расщепления.

О функции readLine можно обратиться к официальному документу: https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/readLines