2012-05-29 17 views
7

Ho un file di input con circa 20 milioni di righe. La dimensione del file è di circa 1,2 G. È comunque possibile tracciare i dati in R. Alcune colonne hanno categorie, la maggior parte sono numeri.Tracciare enormi file di dati in R?

Ho provato il mio script di stampa con un piccolo sottoinsieme del file di input su 800K linee, ma anche se ho circa 8G di RAM, non riesco a tracciare tutti i dati. C'è un modo semplice per farlo.

+9

Che cosa speri di vedere in una trama con 20 milioni di punti dati? – Chase

+5

Indipendentemente dalla capacità computazionale, dovrai ridurre i tuoi dati tramite istogrammi, diagrammi di densità 1D e 2D, grafici hexbin, ... –

+0

... continuando sulla falsariga della risposta di @Paul Hiemstra qui sotto - se dai un po ' maggiori dettagli su (un sottoinsieme di) tuoi dati potresti ottenere una discussione interessante sulle possibilità di visualizzazione andando qui. Inoltre, 'ggplot' potrebbe essere più lento/più affamato di memoria rispetto ad altre possibilità, se vuoi davvero tracciare ogni punto. –

risposta

12

Senza una descrizione più chiara del tipo di trama che si desidera, è difficile dare suggerimenti concreti. Tuttavia, in generale non è necessario tracciare 20 milioni di punti in una trama. Ad esempio, un timeseries potrebbe essere rappresentato da uno spline adattato o da un tipo di media, ad es. aggregare i dati orari alle medie giornaliere. In alternativa, puoi disegnare alcuni sottoinsiemi di dati, ad es. solo un punto al giorno nell'esempio degli orari. Quindi penso che la tua sfida non sia tanto ottenere 20M punti, o anche 800k, su una trama, ma come aggregare efficacemente i tuoi dati in modo tale da trasmettere il messaggio che vuoi dire.

+3

Il campionamento dei dati e la ripetizione del processo alcune volte mostrerebbero anche i pattern nascosti nei dati. –

+1

Sono d'accordo con @ RomanLuštrik, se il pattern si ripete per esempio campioni di 10.000 punti, si sa che il pattern è costante (aka stazionario). In caso contrario, un campione di 10.000 punti non è sufficiente. –

0

espande la memoria disponibile con l'aiuto di memory.limit(size=2000) (o qualcosa di più grande)?

3

tracciare direttamente in un dispositivo di file raster (chiamando per esempio png()) è molto più veloce. Ho provato a tracciare rnorm(100000) e sul mio computer portatile X11 cairo plot ha impiegato 2.723 secondi, mentre il dispositivo png è terminato in 2.001 secondi. con 1 milione di punti, i numeri sono 27.095 e 19.954 secondi.

Io uso Fedora Linux e qui è il codice.

f = function(n){ 
x = rnorm(n) 
y = rnorm(n) 
png('test.png') 
plot(x, y) 
dev.off()} 

g = function(n){ 
x = rnorm(n) 
y = rnorm(n) 
plot(x, y)} 

system.time(f(100000)) 
system.time(g(100000)) 
4

Il pacchetto hexbin per tracciare hexbins invece di scatterplots per coppie di variabili come suggerito da Ben Bolker in Speed up plot() function for large dataset ha funzionato per me per 2 milioni di record in modo equo con 4 GB di RAM. Ma ha fallito per 200 milioni di record/righe per lo stesso set di variabili. Ho provato a ridurre la dimensione del cestino per regolare il tempo di calcolo rispetto all'utilizzo della RAM, ma non ha aiutato.

Per 20 milioni di record, è possibile provare hexbins con xbins = 20,30,40 per iniziare.

1

Aumentare la memoria con memory.limit() mi ha aiutato ... Questo è per tracciare con ggplot quasi 36K record.