Lendo em pedaços de cada vez usando fread no pacote data.table
Estou tentando inserir um arquivo grande delimitado por tabulação (em torno de 2 GB) usando ofread
função no pacotedata.table
. No entanto, por ser tão grande, não cabe completamente na memória. Eu tentei inserir em pedaços usando oskip
enrow
argumentos como:
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
}
No caso acima, eu estou lendo em 1 milhão de linhas por vez, realizando um cálculo sobre elas, e então obtendo o próximo milhão, etc. O problema com esse código é que depois que cada pedaço é recuperado,fread
precisa começar a escanear o arquivo desde o início, já que após cada iteração de loop,skip
aumenta em um milhão. Como resultado, depois de cada pedaço,fread
leva mais e mais tempo para realmente chegar ao próximo pedaço tornando isso muito ineficiente.
Existe uma maneira de dizerfread
pausar a cada 1 milhão de linhas, e depois continuar lendo a partir desse ponto sem precisar reiniciar no início? Alguma solução, ou isso deve ser uma nova solicitação de recurso?