Einlesen von Blöcken zu einem Zeitpunkt unter Verwendung von fread in package data.table
Ich versuche, eine große tabulatorgetrennte Datei (ca. 2 GB) mit dem Befehl einzugebenfread
Funktion im Paketdata.table
. Da es jedoch so groß ist, passt es nicht vollständig in den Speicher. Ich habe versucht, es in Stücken einzugeben, indem ich dieskip
undnrow
Argumente wie:
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
}
Im obigen Fall lese ich in jeweils 1 Million Zeilen, führe eine Berechnung für sie durch und erhalte dann die nächste Million usw. Das Problem mit diesem Code ist, dass nach dem Abrufen jedes Blocks Folgendes abgerufen wird:fread
muss beginnen, die Datei von Anfang an zu scannen, da nach jeder Schleife Iteration,skip
erhöht sich um eine Million. Als Ergebnis nach jedem Stück,fread
dauert länger und länger, um tatsächlich zum nächsten Block zu gelangen, was dies sehr ineffizient macht.
Gibt es einen Weg zu sagenfread
jede sagen wir 1 Million Zeilen anhalten und dann von diesem Punkt an weiterlesen, ohne am Anfang neu starten zu müssen? Irgendwelche Lösungen, oder sollte dies eine neue Feature-Anfrage sein?