Leyendo en trozos a la vez usando fread en el paquete de datos.
Estoy tratando de ingresar un archivo grande delimitado por tabulaciones (alrededor de 2GB) usando elfread
función en el paquetedata.table
. Sin embargo, como es tan grande, no cabe completamente en la memoria. Intenté ingresarlo en trozos usando elskip
ynrow
argumentos tales 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
}
En el caso anterior, estoy leyendo en un millón de filas a la vez, realizando un cálculo en ellas y luego obteniendo el siguiente millón, etc. El problema con este código es que después de que se recupera cada fragmento,fread
debe comenzar a escanear el archivo desde el principio, ya que después de cada iteración de bucle,skip
Aumenta en un millón. Como resultado, después de cada trozo,fread
se tarda más y más en llegar al siguiente fragmento, lo que hace que sea muy ineficiente.
Se puede decir de alguna manerafread
¿Pausa cada 1 millón de líneas y luego continúa leyendo a partir de ese momento sin tener que reiniciar al principio? ¿Alguna solución, o debería ser una nueva solicitud de características?