Czytanie fragmentów naraz za pomocą fread w pakiecie data.table
Próbuję wprowadzić duży plik rozdzielany tabulatorami (około 2 GB) za pomocąfread
funkcja w pakieciedata.table
. Jednak ponieważ jest tak duży, nie pasuje całkowicie do pamięci. Próbowałem wprowadzić go w porcjach, używającskip
inrow
argumenty takie jak:
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
}
W powyższym przypadku czytam 1 milion wierszy na raz, wykonuję na nich obliczenia, a następnie otrzymuję następny milion itd. Problem z tym kodem polega na tym, że po pobraniu każdej porcji,fread
musi rozpocząć skanowanie pliku od samego początku, ponieważ po każdej iteracji pętli,skip
wzrasta o milion. W rezultacie po każdym kawałkufread
trwa dłużej i dłużej, aby dostać się do następnej części, czyniąc to bardzo nieefektywnym.
Czy istnieje sposób, by to powiedziećfread
przerwać co 1 milion wierszy, a następnie kontynuować czytanie od tego momentu bez konieczności ponownego uruchamiania na początku? Jakieś rozwiązania lub czy powinno to być nowe żądanie funkcji?