为了处理大型仿真文件(> 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。