mrg*_*oom 6 python numpy matrix bigdata pytables
要在磁盘上存储大矩阵,我使用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)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
我也对使用有限内存使用的线性方程组(SVD和其他)的算法感兴趣.也许这种算法称为核外或迭代,我认为有一些类比,如硬盘< - > ram,gpu ram < - > cpu ram,cpu ram < - > cpu cache.
同时在这里我找到了关于PyTables矩阵乘法一些信息.
我也在R中发现了这个,但我需要它用于Python或Matlab.
Dask.array使用阻塞算法和任务调度为大型磁盘阵列提供了一个numpy接口.它可以很容易地进行核外矩阵乘法和其他简单的numpy操作.
阻塞的线性代数更难,你可能想看看关于这个主题的一些学术着作.Dask确实支持高和瘦的矩阵上的QR和SVD分解.
无论是大型数组,你真的想要阻塞算法,而不是天真的遍历,这会以不愉快的方式击中磁盘.
考虑使用NumExpr进行处理:https://github.com/pydata/numexpr
\n\n...在内部,NumExpr 采用自己的矢量化虚拟机,该虚拟机是围绕分块读取策略设计的,以便有效地操作内存中最佳大小的数据块。如果调整得当,它可以轻松击败 na\xc3\xafve NumPy 操作。
\n\nNumExpr 可能涵盖了问题细分中的#2。如果您通过使用可流式二进制格式解决#1,则可以在加载数据文件 \xe2\x80\x93 时采用分块读取方法,如下所示:
\n\n with open(\'path/to/your-data.bin\', \'rb\') as binary:\n while True:\n chunk = binary.read(4096) # or what have you\n if not chunk:\n break\nRun Code Online (Sandbox Code Playgroud)\n\n如果这对您来说太低级,我建议您查看HDF5库和格式:http://www.h5py.org \xe2\x80\x93 it\xe2\x80\x99s 二进制文件的最佳解决方案据我所知,基于 NumPy 的结构的序列化。该h5py模块支持压缩、分块读取、dtypes、元数据\xe2\x80\xa6 等等。
祝你好运!
\n