7

要将大矩阵存储在磁盘上,我使用 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)

所以我的问题是:

  1. 如何将使用此过程的应用程序的内存消耗限制为某个值,例如 100Mb(或 1Gb 或其他)。另外我不明白如何估计过程的内存消耗(我认为内存仅在“数据" 创建了变量,但是当我们使用 memmap 文件时使用了多少内存?)
  2. 也许对于存储在磁盘上的大矩阵的乘法有一些最佳解决方案?例如,数据可能没有最佳地存储在磁盘上或从磁盘读取,没有正确地chached,并且点积也只使用一个核心。也许我应该使用像 PyTables 之类的东西?

我还对解决内存使用受限的线性方程组(SVD 等)的算法感兴趣。也许这种算法称为核外或迭代,我认为有一些类比,如硬盘驱动器<->ram、gpu ram<->cpu ram、cpu ram<->cpu 缓存。

另外在这里我找到了一些关于 PyTables 中矩阵乘法的信息。

我也在 R 中找到了,但我需要它用于 Python 或 Matlab。

4

2 回答 2

5

Dask.array使用阻塞算法和任务调度为大型磁盘阵列提供了一个 numpy 接口。它可以轻松地进行核外矩阵乘法和其他简单的 numpy 操作。

阻塞线性代数更难,您可能想查看有关该主题的一些学术工作。Dask 确实支持高瘦矩阵上的 QR 和 SVD 分解。

无论对于大型阵列,您确实需要阻塞算法,而不是会以不愉快的方式撞击磁盘的幼稚遍历。

于 2015-05-01T19:21:16.583 回答
2

考虑使用NumExpr进行处理:https ://github.com/pydata/numexpr

...在内部,NumExpr 使用自己的矢量化虚拟机,该虚拟机是围绕分块读取策略设计的,以便有效地对内存中优化大小的数据块进行操作。如果调整得当,它可以轻松击败幼稚的 NumPy 操作。

NumExpr 可能涵盖您对问题的细分中的#2。如果您通过使用可流式二进制格式来解决#1,那么您可以在加载数据文件时使用分块读取方法 - 如下所示:

    with open('path/to/your-data.bin', 'rb') as binary:
        while True:
            chunk = binary.read(4096) # or what have you
            if not chunk:
                break

如果这对您来说太低级,我建议您查看HDF5库和格式:http : //www.h5py.org – 这是我所知道的基于 NumPy 的结构的二进制序列化的最佳解决方案。该h5py模块支持压缩、分块读取、dtypes、元数据……你说的。

祝你好运!

于 2014-05-08T11:50:19.727 回答