2012-04-25 3 views
6

Ho una matrice sparsa che sembra essere troppo grande per essere utilizzata in modo efficace in memoria (2000x2500000, float). Posso formarlo in un file sparse lil_array (scipy) ma se provo a generare una colonna o una fila di array sparsi compressi (A.tocsc(), A.tocsr()) la mia macchina esaurisce la memoria (e c'è anche un serio disallineamento tra i dati in un file di testo 4.4G e il file pickelled lil 12G - sarebbe bello avere un formato disco che si avvicina maggiormente alla dimensione dei dati grezzi).Grande su disk array per numpy

Probabilmente mi occuperò di array ancora più grandi in futuro.

Domanda: Qual è il modo migliore per gestire grandi matrici su disco in modo tale che io possa usare le normali funzioni di numpy in modo trasparente. Ad esempio, somme su righe e colonne, prodotti vettoriali, max, min, affettamento ecc.?

È Pytables la strada da percorrere? c'è un buon (veloce) strato middleware di numl-sql? un segreto su disk array incorporato in numpy?

In passato con gli array (leggermente più piccoli) ho sempre messo in cache i risultati calcolati per molto tempo. Funziona quando gli array finiscono per essere < 4G o così, ma non è più sostenibile.

+0

Quando hai messo in ordine il tuo array, hai fatto in modo di usare il protocollo binario? Se si utilizza il protocollo di testo predefinito, questa potrebbe essere la causa dell'enorme dimensione del file. – DaveP

risposta

2

Spesso utilizzo memory-mapped numpy arrays per elaborare matrici numeriche da più gigabyte. Li trovo a lavorare davvero bene per i miei scopi. Ovviamente, se la dimensione dei dati supera la quantità di RAM, occorre prestare attenzione ai modelli di accesso per evitare thrashing.

+0

Questo potrebbe essere fattibile ma sembra piuttosto inefficiente per gli array sparsi. C'è una versione sparsa? –

+0

@AnthonyBak: Non che io sappia. Tuttavia, una matrice densa di 2000x100000 di 'float32' ha una dimensione di soli 800 MB (sia su disco che in memoria). – NPE

+0

Sì, c'era un errore di battitura nella mia domanda originale. Avrebbe dovuto dire 2000x2500000. –