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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage