Для хранения большой матрицы на диске я использую numpy.memmap.
Вот пример кода для проверки умножения больших матриц:
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)
Итак, мои вопросы:
- Как ограничить потребление памяти приложением, которое использует эту процедуру, некоторым значением, например, до 100 МБ (или 1 ГБ или что-то еще). Также я не понимаю, как оценить потребление памяти процедурой (я думаю, что память выделяется только тогда, когда "data "переменная создается, но сколько памяти используется, когда мы используем файлы memmap?)
- Может быть, есть какое-то оптимальное решение для умножения больших матриц, хранящихся на диске? Например, возможно, данные не оптимально хранятся на диске или считываются с диска, не исправляются должным образом, а также точечный продукт использует только одно ядро. Может быть, мне следует использовать что-то вроде PyTables?
Также меня интересовали алгоритмы решения линейных систем уравнений (SVD и другие) с ограниченным использованием памяти. Может быть, эти алгоритмы называются внеядерными или итеративными, и я думаю, что есть какая-то аналогия, например, жесткий диск ‹-> ram, gpu ram ‹-> cpu ram, cpu ram ‹-> cpu cache.
Также здесь я нашел некоторую информацию об умножении матриц в PyTables.
Также я нашел это в R, но он мне нужен для Python или Matlab.
psutil.set_rlimit
это просто, но, НАСКОЛЬКО, это работает только на Linux. - person Bakuriu   schedule 14.10.2013res
не имеет смысла (а res - самый большой массив ...). Перечитайтеnp.dot
строку документации, вы найдете что-нибудь полезное ... - person seberg   schedule 15.10.2013out
. Так что никакойres[...] = ...
не этого сделает. - person seberg   schedule 15.10.2013