Чтение по частям с использованием 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 миллион строк, а затем продолжить чтение с этого момента без необходимости перезапуска в начале? Любые решения, или это должен быть новый запрос функции?

Ответы на вопрос(3)

Ваш ответ на вопрос