基本上,在python中存储和使用密集矩阵的最佳方法是什么?
我有一个在数组中的每个项之间生成相似性度量的项目。
每个项都是一个自定义类,并存储一个指向另一个类的指针和一个表示它与该类“接近”的数字。
目前,它的工作非常出色,最多可处理约8000个项目,之后会因内存不足而失败。
基本上,如果假设每次比较都使用~30字节(根据测试似乎是准确的)来存储相似度,则意味着所需的总内存是:
numItems^2 * itemSize = Memory
因此,内存使用量是基于项目数的指数。
在我的例子中,每个链接的内存大小约为30字节,因此:
8000 * 8000 * 30 = 1,920,000,000 bytes, or 1.9 GB
它正好在单个线程的内存限制下。
在我看来,必须有一种更有效的方法来做到这一点。我看过memmapping,但是仅仅为了生成相似度值就需要进行大量的计算,并且通过硬盘来限制它看起来有点荒谬。
编辑
我看过纽比和希比。不幸的是,它们也不支持非常大的阵列。>>> np.zeros((20000,20000), dtype=np.uint16)
Traceback (most recent call last):
File "", line 1, in
MemoryError
>>>
进一步编辑
纽比似乎很受欢迎。不过,numpy不会真的做我想做的事情,至少没有另一个抽象层。
我不想存储数字,我想存储对类的引用。Numpy支持对象,但这并不能真正解决数组大小问题。我提到纽比只是作为一个例子,说明什么是不工作的。
有什么建议吗?
编辑好吧,我最后只是重写所有逻辑,这样它就不再存储任何多余的值,从而将内存使用量从O*n^2减少到O*((n*(n-1))/2)。
基本上,整个事件是handshake problem的一个版本,所以我从存储所有链接切换到只存储每个链接的一个版本。
这不是一个完整的解决方案,但我通常没有足够大的数据集来溢出它,所以我认为它会成功的。PyTables非常有趣,但我不知道任何SQL,而且似乎没有任何好的传统切片或基于索引的方法来访问表数据。我以后可能会再讨论这个问题。