2013-08-14 10 views
9

Jestem zaskoczony, jak długo trwa odczyt R w określonej linii z dużego pliku (11 GB +). Na przykład:Efektywne odczytywanie konkretnych linii z dużych plików do R

> t0 = Sys.time() 
> read.table('data.csv', skip=5000000, nrows=1, sep=',') 
     V1  V2 V3 V4 V5 V6 V7 
1 19.062 56.71047 1 16 8 2006 56281 
> print(Sys.time() - t0) 
Time difference of 49.68314 secs 

Terminal OSX może natychmiast zwrócić określoną linię. Czy ktoś wie bardziej skuteczny sposób w R?

+5

To nieefektywne, ponieważ 'read.table' nazywa' readLines (file, skip) ', które faktycznie parsuje linie i czyta do R, a następnie je odrzuca. Aby być bardziej wydajnym, myślę, że będziesz musiał poprawić kod C, który 'seek()' d przez połączenie, aż zobaczysz wystarczająco dużo nowych linii (i będziesz musiał użyć odpowiedniego buforowania, aby być szybkim) – hadley

Odpowiedz

18

Cóż można użyć coś jak ten

dat <- read.table(pipe("sed -n -e'5000001p' data.csv"), sep=',') 

czytać tylko linię wyodrębnione z innych narzędzi powłokowych.

Należy również pamiętać, że system.time(someOps) to łatwiejszy sposób mierzenia czasu.

+0

Dzięki Dirk. Ta formuła działa dla mnie: 'dat <- read.table (pipe (" sed "5000000q; d 'data.csv"), sep =', ') ' – geotheory

+0

Lub dla zakresu:' read.table (pipe (" sed -n '5000010q; 5000000,5000010p' data.csv "), sep = ',')' – geotheory

+0

Niestety, ominęło 'p' po adresie. Teraz poprawiony. Jeśli znasz zasięg, zarówno sed, jak i awk oferują wiele możliwości. –

Powiązane problemy