2013-08-14 11 views
9

Sono sorpreso dal tempo necessario per leggere R in una riga specifica da un file di grandi dimensioni (11 GB +). Ad esempio:Leggere in modo efficiente righe specifiche da file di grandi dimensioni in 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 

Il terminale OSX può restituire una linea specifica in un istante. Qualcuno sa un modo più efficiente in R?

+5

È inefficiente perché 'read.table' chiama' readLines (file, salta) 'che effettivamente analizza le righe e legge in R, quindi le getta via. Per essere più efficiente penso che dovresti correggere qualche codice C che 'seek()' d attraverso la connessione fino a quando non hai visto abbastanza newline (e dovresti usare il buffering in modo appropriato per essere veloce) – hadley

risposta

18

ben si può usare qualcosa di simile

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

a leggere solo la linea estratta con altri strumenti di shell.

Si noti inoltre che system.time(someOps) è un modo più semplice per misurare il tempo.

+0

Grazie Dirk. Questa formula funziona per me: 'dat <- read.table (pipe (" sed '5000000q; d' data.csv "), sep = ',')' – geotheory

+0

Oppure per un intervallo: 'read.table (pipe (" sed -n '5000010q; 5000000,5000010p' data.csv "), sep = ',')' – geotheory

+0

Spiacente, ho perso la 'p' dopo l'indirizzo. Ora corretto. Se conosci la gamma, sia sed e awk ofter una moltitudine di scelte. –

Problemi correlati