<bdo id='1Rvoq'></bdo><ul id='1Rvoq'></ul>

      1. <legend id='1Rvoq'><style id='1Rvoq'><dir id='1Rvoq'><q id='1Rvoq'></q></dir></style></legend>

        <small id='1Rvoq'></small><noframes id='1Rvoq'>

        <tfoot id='1Rvoq'></tfoot>
        <i id='1Rvoq'><tr id='1Rvoq'><dt id='1Rvoq'><q id='1Rvoq'><span id='1Rvoq'><b id='1Rvoq'><form id='1Rvoq'><ins id='1Rvoq'></ins><ul id='1Rvoq'></ul><sub id='1Rvoq'></sub></form><legend id='1Rvoq'></legend><bdo id='1Rvoq'><pre id='1Rvoq'><center id='1Rvoq'></center></pre></bdo></b><th id='1Rvoq'></th></span></q></dt></tr></i><div id='1Rvoq'><tfoot id='1Rvoq'></tfoot><dl id='1Rvoq'><fieldset id='1Rvoq'></fieldset></dl></div>

        Python:numpy.corrcoef内存错误

        时间:2024-08-21
      2. <tfoot id='aEheV'></tfoot>

        <small id='aEheV'></small><noframes id='aEheV'>

        <legend id='aEheV'><style id='aEheV'><dir id='aEheV'><q id='aEheV'></q></dir></style></legend>
            <bdo id='aEheV'></bdo><ul id='aEheV'></ul>
              <i id='aEheV'><tr id='aEheV'><dt id='aEheV'><q id='aEheV'><span id='aEheV'><b id='aEheV'><form id='aEheV'><ins id='aEheV'></ins><ul id='aEheV'></ul><sub id='aEheV'></sub></form><legend id='aEheV'></legend><bdo id='aEheV'><pre id='aEheV'><center id='aEheV'></center></pre></bdo></b><th id='aEheV'></th></span></q></dt></tr></i><div id='aEheV'><tfoot id='aEheV'></tfoot><dl id='aEheV'><fieldset id='aEheV'></fieldset></dl></div>

                <tbody id='aEheV'></tbody>

                1. 本文介绍了Python:numpy.corrcoef内存错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我试图计算从文本读取的大量数据之间的相关性。对于极大的数据集,程序会给出内存错误。有人能告诉我如何纠正这个问题吗?谢谢

                  以下是我的代码:

                  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行块,然后生成的1000x1000矩阵很容易保存在内存中。然后,您可以将结果组合到不一定在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
                  • 的复数共轭
                  • 代码会乱码bigdata以维护性能并最大限度地减少内存使用;如果需要保留它,请复制一份

                  上面的代码在我的机器上运行大约需要85秒,但是数据基本上可以放在RAM中,而且我有一个SSD磁盘。该算法以这样的顺序编码,以避免对HDD的太随机访问,即访问是合理顺序的。相比之下,即使您有大量内存,非内存映射标准版本的速度也不会显著提高。(实际上,在我的情况下花费的时间要长得多,但我怀疑我的16GiB用完了,然后发生了大量的交换。)

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

                  当然,这种方法很容易并行,因为块计算是完全独立的。此外,还可以在线程之间轻松共享memmap数组。

                  这篇关于Python:numpy.corrcoef内存错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:尝试加载5 GB文本文件时出现内存错误 下一篇:在python中按多个条件合并不同数量的行和列

                  相关文章

                  <small id='ULvGl'></small><noframes id='ULvGl'>

                2. <tfoot id='ULvGl'></tfoot>

                  <legend id='ULvGl'><style id='ULvGl'><dir id='ULvGl'><q id='ULvGl'></q></dir></style></legend>
                  <i id='ULvGl'><tr id='ULvGl'><dt id='ULvGl'><q id='ULvGl'><span id='ULvGl'><b id='ULvGl'><form id='ULvGl'><ins id='ULvGl'></ins><ul id='ULvGl'></ul><sub id='ULvGl'></sub></form><legend id='ULvGl'></legend><bdo id='ULvGl'><pre id='ULvGl'><center id='ULvGl'></center></pre></bdo></b><th id='ULvGl'></th></span></q></dt></tr></i><div id='ULvGl'><tfoot id='ULvGl'></tfoot><dl id='ULvGl'><fieldset id='ULvGl'></fieldset></dl></div>
                      <bdo id='ULvGl'></bdo><ul id='ULvGl'></ul>