2013-04-22 2 views
22

Sto cercando di implementare algoritmi per dati 1000-dimensionali con punti dati 200k + in python. Voglio usare numpy, scipy, sklearn, networkx e altre librerie utili. Voglio eseguire operazioni come la distanza a coppie tra tutti i punti e fare il clustering su tutti i punti. Ho implementato algoritmi di lavoro che eseguono ciò che voglio con ragionevole complessità ma quando provo a ridimensionarli a tutti i miei dati, ho esaurito ram. Certo che lo faccio, creando la matrice per le distanze a coppie su 200k + i dati richiedono molta memoria.Lavorare con i big data in python e numpy, non abbastanza ram, come salvare i risultati parziali sul disco?

Ecco il trucco: mi piacerebbe davvero farlo su computer scadenti con basse quantità di RAM.

C'è un modo fattibile per far funzionare questo lavoro senza i limiti del basso ram. Che ci vorrà molto più tempo non è davvero un problema, a patto che le richieste di tempo non vadano all'infinito!

Mi piacerebbe essere in grado di mettere i miei algoritmi al lavoro e poi tornare indietro di un'ora o più e non averlo bloccato perché è rimasto senza ram! Mi piacerebbe implementarlo in python, ed essere in grado di usare le librerie numpy, scipy, sklearn e networkx. Mi piacerebbe essere in grado di calcolare la distanza a due a tutti i miei punti, ecc.

È fattibile? E come potrei farlo, cosa posso iniziare a leggere?

migliori saluti // Mesmer

+0

La tua domanda è piuttosto vaga e molto ampia. Sono dimensioni di dati abbastanza normali per molte applicazioni nell'elaborazione del segnale e nell'apprendimento automatico. Suggerisco di andare a scoprire gli algoritmi e le tecniche utilizzate in quei campi. –

+3

Voglio essere in grado di eseguire, ad esempio, la distanza a coppie tra tutti i punti in una matrice 200.000 x 1000 in python senza avere abbastanza ram per mantenere in memoria l'intera matrice della distanza. Sto cercando informazioni su come farlo :) risposte più concrete quindi un vago "sguardo in due interi sottosistemi dell'informatica" sarebbe utile! – Ekgren

+6

Probabilmente vorrai dare un'occhiata a [memmap] di numpy (http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html) e possibilmente [PyTables] (http: // www. pytables.org) come punto di partenza. –

risposta

31

Utilizzando numpy.memmap si creare array direttamente mappate in un file:

import numpy 
a = numpy.memmap('test.mymemmap', dtype='float32', mode='w+', shape=(200000,1000)) 
# here you will see a 762MB file created in your working directory  

È possibile trattarlo come un array convenzionale: un + = 1000.

E 'possibile anche assegnare più array di lo stesso file, controllandolo da fonti reciproche se necessario. Ma ho vissuto alcune cose complicate qui. Per aprire la serie completa si deve "chiudere" la precedente prima, utilizzando del:

del a  
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000)) 

Ma openning solo una parte della matrice permette di ottenere il controllo simultaneo:

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000)) 
b[1,5] = 123456. 
print a[1,5] 
#123456.0 

Grande! a è stato modificato insieme a b. E i cambiamenti sono già scritti sul disco.

L'altra cosa importante che vale la pena di commentare è offset. Si supponga di voler prendere non le prime 2 righe in b, ma le linee 150000 e 150001.

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000), 
       offset=150000*1000*32/8) 
b[1,2] = 999999. 
print a[150001,2] 
#999999.0 

Ora è possibile accedere e aggiornare qualsiasi parte della matrice in operazioni simultanee. Nota la dimensione in byte che va nel calcolo dell'offset. Quindi per un 'float64' questo esempio sarebbe 150000 * 1000 * 64/8.

Altri riferimenti:

0

Si può solo decollare la memoria virtuale sul sistema operativo e utilizzare a 64-bit di pitone, fornendo è un 64-bit OS.

+0

Perché dici "fornendo un sistema operativo a 64 bit"? Python a 32 bit non usa la memoria virtuale? Chiedo perché sto correndo in errori di memoria che pensavo sarebbero stati risolti espandendo il file di pagina di memoria virtuale di Windows 7, ma sono rimasti uguali. – Lobotomik

+2

I processi a 32 bit sono limitati a 2 GB di RAM (virtuale o meno). Questo perché 32 bit consente solo l'indirizzamento di 4 GB e il sistema operativo riserva 2 GB. È possibile modificarlo a 3Gb/1 Gb, ma questo è il tuo limite. L'unico altro modo per aggirare questo è dividere il programma in processi separati usando il modulo multiprocesso, limitando ciascuno a 2Gb. – xorsyst