2012-01-08 1 views
5

Attualmente ho un progetto in esecuzione su PiCloud che coinvolge più iterazioni di un Risolutore ODE. Ogni iterazione produce una matrice NumPy di ​​circa 30 righe e 1500 colonne, con ciascuna iterazione aggiunta alla fine dell'array dei risultati precedenti.Modi efficienti per scrivere un grande array NumPy su un file

Normalmente, avrei lasciato che questi array abbastanza grandi fossero restituiti dalla funzione, li tenessero in memoria e li gestissero tutti insieme. Tranne PiCloud ha un limite abbastanza restrittivo sulla dimensione dei dati che possono essere restituiti da una funzione, per ridurre i costi di trasmissione. Il che va bene, tranne il fatto che dovrei avviare migliaia di lavori, ognuno dei quali è in esecuzione su iterazione, con un notevole sovraccarico.

Sembra che la soluzione migliore sia scrivere l'output in un file e quindi raccogliere il file utilizzando un'altra funzione che non ha un limite di trasferimento.

La mia scommessa migliore è semplicemente scaricarla in un file CSV? Dovrei aggiungere al file CSV ogni iterazione o tenerlo tutto in un array fino alla fine e poi scrivere una sola volta? C'è qualcosa di terribilmente intelligente che mi manca?

risposta

8

A meno che non vi sia un motivo per cui i file intermedi siano leggibili, fare non utilizzare CSV, poiché ciò comporterebbe inevitabilmente una perdita di precisione.

Il più efficiente è probabilmente tofile (doc) che è destinato a discariche veloci di file su disco quando si conoscono tutti gli attributi dei dati in anticipo.

Per i salvataggi indipendenti dalla piattaforma, ma specifici per numpy, è possibile utilizzare save (doc).

Numpy e scipy hanno anche il supporto per vari formati di dati scientifici come HDF5 se è necessaria la portabilità.

+0

Non c'è davvero un motivo per cui siano leggibili dall'uomo - così abituati a usare i file CSV per spostarsi attorno ai set di dati, dove la precisione non è un fattore (la maggior parte delle cose sono numeri interi). Questo sembra riguardare quello che stavo cercando. – Fomite

2

Si consiglia di guardare il modulo pickle. Il modulo pickle consente di serializzare oggetti python come flussi di byte (ad es. Stringhe). Ciò consente di scriverli in un file o di inviarli tramite una rete, quindi di riprendere gli oggetti in un secondo momento.

+1

uso cPickle invece di salamoia, è il modo più veloce. – Martlark

+0

pickle è buono per l'uso immediato ma non dovrebbe essere usato quando devi portarlo attraverso le versioni di python (non è compatibile con le versioni precedenti, ad esempio 3.x non può leggere i dati binari decimati da 2.x nonostante ciò che dice sempre la documentazione) usa il formato npy nativo di numpy. (http://bugs.python.org/issue6784) – staticd

2

Prova Joblib - Fast compressed persistence

Uno dei componenti chiave di joblib è la sua capacità di persistere oggetti Python arbitrari, e leggerle di nuovo molto rapidamente. È particolarmente efficiente per i container che fanno il loro sollevamento pesante con array numpy. Il trucco per ottenere una grande velocità è stato quello di salvare in file separati gli array numpy e caricarli tramite memmapping.

Edit: Newer (2016) blog entry on data persistence in Joblib