本文介绍了Python:numpy.corrcoef内存错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!
问题描述
我试图计算从文本读取的大量数据之间的相关性。对于极大的数据集,程序会给出内存错误。有人能告诉我如何纠正这个问题吗?谢谢
以下是我的代码:
以下是错误:
推荐答案
您的内存不足,如注释所示。如果因为您使用的是32位Python而发生这种情况,那么即使是下面的方法也会失败。但是对于64位Python和RAM不是很多的情况,我们可以做很多事情,因为计算相关性很容易分段完成,因为您只需要同时在内存中使用两行。
因此,您可以将输入拆分成(比方说)1000行块,然后生成的1000x1000矩阵很容易保存在内存中。然后,您可以将结果组合到不一定在RAM中的大输出矩阵中。即使您有很多RAM,我也推荐使用这种方法,因为这对内存更加友好。如果输入可以保留在RAM中,则快速随机访问不会对相关系数计算有很大帮助。 不幸的是,numpy.corrcoef
不会自动执行此操作,我们将不得不进行自己的相关系数计算。幸运的是,这并不像听起来那么难。
大致如下:
注意事项:
- 上面的代码经过测试
np.corrcoef(bigdata)
- 如果您有复数值,则需要创建一个复数输出数组
res
并取chunk2.T
的复数共轭
- 代码会乱码
bigdata
以维护性能并最大限度地减少内存使用;如果需要保留它,请复制一份
上面的代码在我的机器上运行大约需要85秒,但是数据基本上可以放在RAM中,而且我有一个SSD磁盘。该算法以这样的顺序编码,以避免对HDD的太随机访问,即访问是合理顺序的。相比之下,即使您有大量内存,非内存映射标准版本的速度也不会显著提高。(实际上,在我的情况下花费的时间要长得多,但我怀疑我的16GiB用完了,然后发生了大量的交换。)
您可以通过省略矩阵的一半来加快实际计算速度,因为res.T == res
。实际上,您可以省略c > r
处的所有块,然后稍后对它们进行镜像。另一方面,性能很可能受到硬盘性能的限制,因此其他优化不一定会带来更高的速度。
这篇关于Python:numpy.corrcoef内存错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!
本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!