【发布时间】:2011-03-14 05:11:37
【问题描述】:
基本上,在 python 中存储和使用密集矩阵的最佳方法是什么?
我有一个项目可以在数组中的每个项目之间生成相似度指标。
每个项目都是一个自定义类,并存储一个指向另一个类的指针和一个表示它与该类“接近度”的数字。
现在,它可以出色地处理大约 8000 个项目,之后它会因内存不足错误而失败。
基本上,如果您假设每次比较使用 ~30(根据测试似乎准确)字节来存储相似性,这意味着所需的总内存为:numItems^2 * itemSize = Memory
因此,内存使用量是基于项目数的指数。
就我而言,每个链接的内存大小约为 30 字节,因此:8000 * 8000 * 30 = 1,920,000,000 bytes, or 1.9 GB
这正好是单个线程的内存限制。
在我看来,必须有一种更有效的方法来做到这一点。我看过 memapping,但它已经是计算密集型的,只是为了生成相似度值,而且通过硬盘驱动器瓶颈似乎有点荒谬。
编辑
我看过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)。
基本上,这整个事件是handshake problem 的一个版本,所以我已经从存储所有链接切换到每个链接只存储一个版本。
这不是一个完整的解决方案,但我通常没有足够大的数据集来溢出它,所以我认为它会解决的。 PyTables 真的很有趣,但我不知道任何 SQL,而且似乎没有任何好的传统切片或基于索引的方式来访问表数据。我以后可能会重新讨论这个问题。
【问题讨论】:
-
嗯。刚刚找到 PyTables(pytables.org)。看起来很有希望
-
愿意将其发布为答案吗?看来是要走的路。
标签: python matrix 32-bit python-2.6 windows-xp