2014-07-11 12 views
5

Sto osservando una velocità incoerente di dati.bile di funzione fread. Devo 2 file di ~ 8 GB. Il contenuto dei file è (quasi) lo stesso. Il tempo di leggere due file è stranamente diverso.R pread dati.table velocità incoerente

control.major <- fread("control.major.gff")$V6 
Read 19.8% of 98100000 rows 
Read 98100000 rows and 10 (of 10) columns from 7.947 GB file in 02:06:58 
control.minor <- fread("control.minor.gff")$V6 
Read 98100000 rows and 10 (of 10) columns from 7.947 GB file in 00:03:15 

Devo leggere la sesta colonna dei file che sono tutti numerici. Inizialmente ho scoperto che fread è stato più veloce rispetto alla

scan(pipe("cut -f6 SNP.major.gff"), sep="\n") 

Perché funzione di taglio stava prendendo sacco di tempo.

Perché c'è un comportamento incoerente di fread? C'è un modo più veloce per leggere una colonna?

+1

Sto indovinando che il secondo comando è lento a causa di 'scan' e non a causa di' cut', quindi proverei 'fread ('cut -f6 SNP.major.gff')' invece – eddi

+0

btw che prima il tempo sembra pazzo lungo - 2 ore ?! - forse puoi isolare di più il problema e provare a vedere se ottieni tempi lunghi con una porzione minuscola di quel file. – eddi

+0

@eddi Non penso che fread e scan facciano differenza rispetto al tempo di esecuzione. Il suo taglio è molto più lento. – vinash85

risposta

3

Ho avuto un problema simile. Vale a dire, la prima volta che ho corso è stato molto lento, tuttavia le corse successive sono state molto più veloci. Nel mio caso ciò era dovuto al fatto che stavo lavorando su un computer nel laboratorio informatico della mia Università. Di conseguenza, i dati non erano localmente sulla mia macchina, ma erano su una rete. Ciò significava che la maggior parte del tempo trascorso a spasso veniva effettivamente rappresentato trasferendo i dati attraverso la rete e nella memoria di lavoro locale. Ciò è stato corroborato dal fatto che quando ho programmato il mio codice al primo tentativo, lo user time + elapsed time.

Quando si caricano i dati una volta, tuttavia, si trova temporaneamente nella memoria di lavoro, ad esempio RAM. Le chiamate successive a battere con gli stessi dati sono quindi molto più veloci.

So che questo è un thread vecchio, ma era uno che posso attraverso quando stavo cercando di risolvere il mio problema con fread. Quindi spero che questo aiuti altre persone con un problema simile in futuro!

3

Perché ci sono volute 2 ore per caricare?

Si prega di eseguire di nuovo con verbose=TRUE e includere l'output completo nella domanda. Forse il sistema operativo lo ha messo in secondo piano mentre qualcos'altro funzionava, o qualcosa del genere. Il tuo laptop è stato sospeso o ibernato in quel momento? Si prega di includere anche l'output di sessionInfo().

C'è un modo più veloce per leggere una colonna?

Sì. È possibile passare un vettore di nomi di colonne o posizioni all'argomento select. Vedi ?fread. Ma sospetto che i due problemi non siano correlati.

Problemi correlati