2014-10-05 28 views
5

Ho bisogno di leggere parti di un enorme array numpy memorizzato in un file mappato in memoria, elaborare i dati e ripetere per un'altra parte dell'array. L'intero array numpy occupa circa 50 GB e la mia macchina ha 8 GB di RAM.File mappato memoria per array numpy

Inizialmente ho creato il file di memoria mappato utilizzando numpy.memmap leggendo in un sacco di file più piccoli ed elaborando i loro dati e quindi scrivendo i dati elaborati nel file memmap. Durante la creazione del file memmap, non ho avuto problemi di memoria (stavo periodicamente usando memmap.flush()). Ecco come ho creato il file mappato di memoria:

mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2)) 
for i1 in np.arange(numFiles): 
    auxData = load_data_from(file[i1]) 
    mmapData[i1,:] = auxData 
    mmapData.flush() % Do this every 10 iterations or so 

Tuttavia, quando provo ad accedere piccole porzioni (< 10 MB) del file memmap, inonda tutta la mia RAM quando viene creato l'oggetto memmap. La macchina rallenta drasticamente e non posso fare nulla. Ecco come provo a leggere i dati dal file mappato di memoria:

mmapData = np.memmap(mmapFile, mode='r',shape=(large_no1,large_no2)) 
aux1 = mmapData[5,1:1e7] 

ho pensato usando mmap o numpy.memmap dovrebbe permettermi di accedere a parti di array massicce senza cercare di caricare il tutto a memoria. Cosa mi manca?

Sto utilizzando lo strumento sbagliato per accedere a parti di un grande array numpy (> 20 GB) memorizzato nel disco?

+0

Non l'ho ancora riprodotto, ma anche a me sembra sorprendente. Pensavo che le fette fossero solo dei punti grassi ... Sei sicuro che l'esecuzione non superi l'assegnazione aux1? Se supera il compito e lo stai leggendo, verrà caricata più memoria di quanto ti aspetteresti a causa del fatto che le linee della cache sono più grandi di 5 byte (in genere 64 byte), a seconda che tu stia utilizzando order = 'C 'o' F '. Ma questo non dovrebbe essere sufficiente per irrigare una macchina con 8 GB di RAM disponibile, quindi questa non è una risposta. –

risposta

1

Potrebbe essere che si sta guardando virtuale, piuttosto che il consumo di memoria fisica, e il rallentamento proviene da qualcos'altro?