Per memorizzare una matrice grande su disco uso numpy.memmap.Moltiplicazione grande matrice numpy efficiente
Ecco un codice di esempio per testare grande moltiplicazione di matrici:
import numpy as np
import time
rows= 10000 # it can be large for example 1kk
cols= 1000
#create some data in memory
data = np.arange(rows*cols, dtype='float32')
data.resize((rows,cols))
#create file on disk
fp0 = np.memmap('C:/data_0', dtype='float32', mode='w+', shape=(rows,cols))
fp1 = np.memmap('C:/data_1', dtype='float32', mode='w+', shape=(rows,cols))
fp0[:]=data[:]
fp1[:]=data[:]
#matrix transpose test
tr = np.memmap('C:/data_tr', dtype='float32', mode='w+', shape=(cols,rows))
tr= np.transpose(fp1) #memory consumption?
print fp1.shape
print tr.shape
res = np.memmap('C:/data_res', dtype='float32', mode='w+', shape=(rows,rows))
t0 = time.time()
# redifinition ? res= np.dot(fp0,tr) #takes 342 seconds on my machine, if I multiplicate matrices in RAM it takes 345 seconds (I thinks it's a strange result)
res[:]= np.dot(fp0,tr) # assignment ?
print res.shape
print (time.time() - t0)
Quindi le mie domande sono:
- Come limitare consumtion memoria del aplication che sta usando questa procedura per un certo valore, per esempio a 100 Mb (o 1 Gb o qualcos'altro). Inoltre non capisco come stimare il consumo di memoria della procedura (penso che la memoria viene allocata solo quando viene creata la variabile "dati", ma quanta memoria utilizzata quando si usano i file memmap?)
- Forse c'è qualche soluzione ottimale per la moltiplicazione di grandi matrici memorizzate su disco? Ad esempio, forse i dati non sono memorizzati in modo ottimale su disco o letti dal disco, non correttamente memorizzati, e anche i prodotti a punti usano solo un core. Forse dovrei usare qualcosa come PyTables?
Inoltre, sono interessato agli algoritmi di risoluzione del sistema di equazioni lineari (SVD e altri) con utilizzo limitato della memoria. Forse questo algoritmo ha chiamato fuori dal core o iterativo e penso che ci sia qualche analogia come il disco rigido < -> ram, gpu ram < -> cpu ram, cpu ram < -> cpu cache.
Anche here Ho trovato alcune informazioni sulla moltiplicazione della matrice in PyTables.
Inoltre ho trovato this in R ma ne ho bisogno per Python o Matlab.
"Come limitare il consumo di memoria dell'applicazione che utilizza questa procedura su un valore ad esempio a 100 Mb" Vuoi dire che se l'applicazione tenta di utilizzare più memoria dovrebbe fallire? Usare 'psutil.set_rlimit' è facile, ma AFAIK funziona solo su linux. – Bakuriu
No, voglio dire che l'applicazione deve funzionare normalmente ma usare meno della memoria dichiarata (generalmente parlando sarà più lento con meno memoria, ma è utile quando vogliamo limitare l'utilizzo della memoria dell'applicazione o se non abbiamo abbastanza memoria per adattarsi intera matrice). E io lavoro su Windows. – mrgloom
La riga 'res' non ha senso (e res è l'array più grande ...). Rileggere la docstring di 'np.dot', troverai qualcosa di utile ... – seberg