gpt4 book ai didi

python - 在 python 中处理大型密集矩阵

转载 作者:太空狗 更新时间:2023-10-30 01:47:21 25 4
gpt4 key购买 nike

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

我有一个项目可以生成数组中每个项目之间的相似性指标。

每个项目都是一个自定义类,并存储一个指向另一个类的指针和一个表示它与该类“接近”的数字。

目前,它在处理约 8000 个项目时表现出色,之后它会因内存不足错误而失败。
基本上,如果您假设每次比较使用 ~30(根据测试似乎是准确的)字节来存储相似性,这意味着所需的总内存为:
numItems^2 * itemSize = 内存
因此,内存使用量根据项目数量呈指数增长。
就我而言,每个链接的内存大小约为 30 字节,因此:
8000 * 8000 * 30 = 1,920,000,000 字节,或 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)

基本上,这整个事件是 handshake problem 的一个版本,因此我已从存储所有链接切换为仅存储每个链接的一个版本。

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

最佳答案

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

它是一个基本上呈现类似 numpy 界面的库,但使用压缩的内存映射文件来存储任意大小的数组(它基本上是 HDF5 的包装器)。

PyTables 是建立在它之上的,PyTables 实际上引导我找到了它。但是,我不需要 PyTables 主要提供的任何 SQL 功能,而且 PyTables 没有提供我真正需要的类似数组的干净接口(interface)。

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

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

关于python - 在 python 中处理大型密集矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3218645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com