Чтение по частям с использованием fread в пакете data.table
Я пытаюсь ввести большой файл с разделителями табуляции (около 2 ГБ), используяfread
функция в пакетеdata.table
, Однако, поскольку он такой большой, он не умещается полностью в памяти. Я попытался ввести его кусками, используяskip
а такжеnrow
такие аргументы как:
chunk.size = 1e6
done = FALSE
chunk = 1
while(!done)
{
temp = fread("myfile.txt",skip=(chunk-1)*chunk.size,nrow=chunk.size-1)
#do something to temp
chunk = chunk + 1
if(nrow(temp)<2) done = TRUE
}
В приведенном выше случае я читаю по 1 миллиону строк за раз, выполняю для них вычисления, а затем получаю следующий миллион и т. Д. Проблема с этим кодом заключается в том, что после извлечения каждого чанка,fread
необходимо начать сканирование файла с самого начала, так как после каждой итерации цикла,skip
увеличивается на миллион. В результате после каждого куска,fread
требуется больше и больше времени, чтобы фактически добраться до следующего куска, делая это очень неэффективным.
Есть ли способ сказатьfread
приостановить каждый, скажем, 1 миллион строк, а затем продолжить чтение с этого момента без необходимости перезапуска в начале? Любые решения, или это должен быть новый запрос функции?