python申请超大矩阵_在python中处理大型密集矩阵

基本上,在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,而且似乎没有任何好的传统切片或基于索引的方法来访问表数据。我以后可能会再讨论这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值