在python中处理大型密集矩阵

Fak*_*ame 4 python windows-xp 32-bit matrix python-2.6

基本上,在python中存储和使用密集矩阵的最佳方法是什么?

我有一个项目,可以在数组中的每个项目之间生成相似度量.

每个项目都是一个自定义类,并存储一个指向另一个类的指针和一个表示它与该类"紧密"的数字.

现在,它的工作效果非常好,约为8000件,之后失败并出现内存错误.
基本上,如果您假设每个比较使用〜30(看起来准确基于测试)字节来存储相似性,则意味着所需的总内存为:
numItems^2 * itemSize = Memory
因此内存使用量是基于项目数的指数.
在我的例子中,每个链接的内存大小约为30个字节,因此:
8000 * 8000 * 30 = 1,920,000,000 bytes, or 1.9 GB
这是单个线程的内存限制.

在我看来,必须有一种更有效的方法来做到这一点.我已经看过了memmapping,但是为了生成相似度值已经计算密集了,并且通过硬盘驱动器将其瓶颈似乎有点荒谬.

编辑
我看着numpy和scipy.不幸的是,它们也不支持非常大的阵列.

>>> np.zeros((20000,20000), dtype=np.uint16)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>>
Run Code Online (Sandbox Code Playgroud)

进一步编辑
Numpy似乎很受欢迎.然而,numpy不会真正做我想要的,至少没有另一个抽象层.

不想存储数字,我想存储类的引用.Numpy支持对象,但这并不能解决数组大小问题.我长大numpy的,就像什么例子工作.

有什么建议?

编辑好吧,我结束了刚刚重写所有的逻辑,使其不再存储任何冗余的值,从降低内存使用率O*n^2O*((n*(n-1))/2).

基本上,整个事件是握手问题的一个版本,所以我已经从存储所有链接切换到每个链接的单个版本.

这不是一个完整的解决方案,但我通常没有足够大的数据集来溢出它,所以我认为它会成功.PyTables真的很有趣,但我不知道任何SQL,并且似乎没有任何好的传统切片或基于索引的方式来访问表数据.我将来可能会重新审视这个问题.

Fak*_*ame 11

好吧,我找到了我的解决方案:
h5py

它是一个基本上呈现类似numpy的接口的库,但使用压缩的memmapped文件来存储任意大小的数组(它基本上是HDF5的包装器).

PyTables是建立在它上面的,PyTables实际上引导我.但是,我不需要任何作为PyTables主要产品的SQL功能,而PyTables不提供我真正想要的干净的数组类接口.

h5py基本上就像一个numpy数组,只是以不同的格式存储数据.

它似乎对数组大小没有限制,除了磁盘空间.我目前正在对100,000*100,000阵列的uint16进行测试.