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^2来O*((n*(n-1))/2).
基本上,整个事件是握手问题的一个版本,所以我已经从存储所有链接切换到每个链接的单个版本.
这不是一个完整的解决方案,但我通常没有足够大的数据集来溢出它,所以我认为它会成功.PyTables真的很有趣,但我不知道任何SQL,并且似乎没有任何好的传统切片或基于索引的方式来访问表数据.我将来可能会重新审视这个问题.