如何知道所使用的阵列大小来预测内存错误?

时间:2019-02-25 16:23:57

标签: python arrays numpy psutil

为了处理大型仿真文件(> 6 GB),我创建了一个gui,它会引导用户完成每个步骤。使用仿真软件的API,我创建了一个工作脚本,用于批量提取相关数据。尽管该程序主要用于提取较小的时间间隔或仅提取几个变量,但用户也可以创建一个导致MemoryError的输出。

由于我要分批提取数据,因此在代码的最后一步之一中,结果将是MemoryError。这不是用户友好的。因此,我想(肯定地)知道输出将产生一个MemoryError并在执行脚本之前就此向用户发出警告。由于用户可以将总批大小设置为1,因此我必须考虑最坏的情况。尽管我已经将API的输出保存在硬盘上,然后再合并。

我知道这种预测在某种程度上是可能的,因为numpy,在执行以下命令(具有8GB RAM)后直接引发MemoryError:

>>> e = np.random.rand(2000000,1000000000)
Traceback (most recent call last):
  File "D:\Continuum\anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2961, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-62-b74d848e009e>", line 1, in <module>
    e = np.random.rand(2000000,1000000000)
  File "mtrand.pyx", line 1363, in mtrand.RandomState.rand
  File "mtrand.pyx", line 861, in mtrand.RandomState.random_sample
  File "mtrand.pyx", line 167, in mtrand.cont0_array
MemoryError

我无法找到引发此错误的代码。

到目前为止,我已经尝试过:

使用psutil.virtual_memory()和维的基本乘积,我比较可用内存和输出数组的估计大小:

import psutil

def checkForMemoryError(num_rows, num_cols):
    sizeInMemory = 1  # Factor to multiple the array dimension to convert to memory size.
    crit_size = psutil.virtual_memory().available  # Get available ram and provide threshold
    trajOutSize = num_cols * num_rows  # Size of trajOut in last interation
    if trajOutSize * sizeInMemory > crit_size:
        raise MemoryError

我认为这种方法有些不好,因为psutil.virtual_memory()返回的值与sys.getsizeof()输出的值不匹配:

In[59]: e = np.random.rand(2000,1000000)
In[60]: sys.getsizeof(e)
Out[60]: 16000000112
In[61]: psutil.virtual_memory().total
Out[61]: 8278392832

在此示例中,np.array的大小是总可用内存大小的两倍。我认为这是因为numpy存储和处理数据的方式。 如果您有兴趣/需要帮助,API的输出将是一个简单的list。稍后,我将此2D列表转换为数据框,以将其另存为.hdf或.csv。

0 个答案:

没有答案