基本上,在 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
>>>
进一步编辑
Numpy 似乎很受欢迎。但是,numpy 不会真正做我想做的事,至少没有另一个抽象层。
我不想存储数字,我想存储对类的引用。Numpy 支持对象,但这并不能真正解决数组大小问题。我提出了 numpy 只是作为不起作用的一个例子。
有什么建议吗?
编辑好吧,我最后只是重写了所有逻辑,因此它不再存储任何冗余值,从而将内存使用量从 减少O*n^2
到O*((n*(n-1))/2)
.
基本上,这整个事件是握手问题的一个版本,所以我已经从存储所有链接切换到每个链接只存储一个版本。
这不是一个完整的解决方案,但我通常没有足够大的数据集来溢出它,所以我认为它会解决的。PyTables 真的很有趣,但我不知道任何 SQL,而且似乎没有任何好的传统切片或基于索引的方式来访问表数据。我将来可能会重新讨论这个问题。