gpt4 book ai didi

Python:numpy.corrcoef 内存错误

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:12 25 4
gpt4 key购买 nike

我试图计算从文本中读取的大量数据之间的相关性。对于非常大的数据集,程序会出现内存错误。谁能告诉我如何解决这个问题。谢谢

以下是我的代码:

enter code here

import numpy
from numpy import *
from array import *
from decimal import *
import sys

Threshold = 0.8;
TopMostData = 10;

FileName = sys.argv[1]

File = open(FileName,'r')

SignalData = numpy.empty((1, 128));
SignalData[:][:] = 0;

for line in File:

TempLine = line.split();
TempInt = [float(i) for i in TempLine]
SignalData = vstack((SignalData,TempInt))

del TempLine;
del TempInt;

File.close();

TempData = SignalData;
SignalData = SignalData[1:,:]
SignalData = SignalData[:,65:128]

print "File Read | Data Stored" + " | Total Lines: " + str(len(SignalData))

CorrelationData = numpy.corrcoef(SignalData)

错误如下:

Traceback (most recent call last):
File "Corelation.py", line 36, in <module>
CorrelationData = numpy.corrcoef(SignalData)
File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 1824, in corrcoef
return c/sqrt(multiply.outer(d, d))
MemoryError

最佳答案

如评论所示,您的内存不足。如果发生这种情况是因为您使用的是 32 位 Python,那么即使下面的方法也会失败。但是对于 64 位 Python 和 RAM 不多的情况,我们可以做很多事情,因为计算相关性很容易分段完成,因为您只需要同时在内存中存储两条线。

因此,您可以将输入分成 1000 行 block ,然后生成的 1000 x 1000 矩阵很容易保存在内存中。然后你可以将你的结果组装到不一定在 RAM 中的大输出矩阵中。即使你有很多 RAM,我也推荐这种方法,因为它对内存更友好。如果输入可以保存在 RAM 中,则相关系数计算不是快速随机访问会有很大帮助的操作。

不幸的是,numpy.corrcoef 不会自动执行此操作,我们必须自己计算相关系数。幸运的是,这并不像听起来那么难。

沿着这些线的东西:

import numpy as np

# number of rows in one chunk
SPLITROWS = 1000

# the big table, which is usually bigger
bigdata = numpy.random.random((27000, 128))

numrows = bigdata.shape[0]

# subtract means form the input data
bigdata -= np.mean(bigdata, axis=1)[:,None]

# normalize the data
bigdata /= np.sqrt(np.sum(bigdata*bigdata, axis=1))[:,None]

# reserve the resulting table onto HDD
res = np.memmap("/tmp/mydata.dat", 'float64', mode='w+', shape=(numrows, numrows))

for r in range(0, numrows, SPLITROWS):
for c in range(0, numrows, SPLITROWS):
r1 = r + SPLITROWS
c1 = c + SPLITROWS
chunk1 = bigdata[r:r1]
chunk2 = bigdata[c:c1]
res[r:r1, c:c1] = np.dot(chunk1, chunk2.T)

一些注意事项:

  • 上面的代码在np.corrcoef(bigdata)上面测试过
  • 如果您有复数值,则需要创建一个复输出数组 res 并采用 chunk2.T 的复共轭
  • 代码乱码大数据以保持性能并最小化内存使用;如果需要保存,请复制一份

上面的代码在我的机器上运行大约需要 85 秒,但数据大部分都可以放在 RAM 中,而且我有一个 SSD 磁盘。该算法以这样的方式编码以避免对 HDD 的过于随机访问,即访问是合理顺序的。相比之下,即使你有很多内存,非内存映射的标准版本也不会明显更快。 (实际上,我的情况花费了更多时间,但我怀疑我用完了 16 GiB,然后进行了大量交换。)

您可以通过省略矩阵的一半来加快实际计算速度,因为 res.T == res。实际上,您可以省略 c > r 中的所有 block ,然后稍后再对它们进行镜像。另一方面,性能很可能受到 HDD 性能的限制,因此其他优化不一定会带来更多速度。

当然,这种方法很容易并行,因为 block 计算是完全独立的。 memmapped 数组也可以很容易地在线程之间共享。

关于Python:numpy.corrcoef 内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24717513/

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