我有一个包含大量对象的程序,其中许多是Numpy数组。我的程序交换得很糟糕,我正在努力减少内存使用量,因为它实际上无法在我的系统上完成当前的内存需求。
我正在寻找一个很好的分析器,它可以让我检查各种对象消耗的内存量(我正在设想一个与cProfile对应的内存),这样我就知道在哪里进行优化。
我听说过关于Heapy的一些不错的事情,但不幸的是,Heapy不支持Numpy数组,而且我的大部分程序都涉及Numpy数组。
发布于 2013-10-11 15:25:27
如果您正在调用许多不同的函数,并且不确定交换来自何处,那么解决此问题的一种方法是使用memory_profiler的新绘图功能。首先,您必须对@profile使用的不同函数进行修饰。为简单起见,我将使用memory_profiler附带的示例examples/numpy_example.py,其中包含两个函数:create_data()和process_data()
要运行脚本,请使用mprof可执行文件,而不是使用Python解释器运行脚本
$ mprof run examples/numpy_example.py这将创建一个名为mprofile_??????????.dat的文件,其中?将保存表示当前日期的数字。要绘制结果,只需输入mprof plot,它将生成类似如下的图形(如果您有多个.dat文件,它将始终采用最后一个文件):

在这里,您可以看到内存消耗,其中的括号表示您何时进入/退出当前函数。这样就很容易看出函数process_data()有一个内存消耗的峰值。要进一步深入研究函数,可以使用逐行分析器查看函数中每行的内存消耗情况。这是通过运行的
python -m memory_profiler examples/nump_example.py这将为您提供类似以下内容的输出:
Line # Mem usage Increment Line Contents
================================================
13 @profile
14 223.414 MiB 0.000 MiB def process_data(data):
15 414.531 MiB 191.117 MiB data = np.concatenate(data)
16 614.621 MiB 200.090 MiB detrended = scipy.signal.detrend(data, axis=0)
17 614.621 MiB 0.000 MiB return detrended很明显,scipy.signal.detrend正在分配大量的内存。
发布于 2013-10-09 05:38:03
看看memory profiler吧。它提供了逐行分析和Ipython集成,这使得它非常容易使用:
In [1]: import numpy as np
In [2]: %memit np.zeros(1e7)
maximum of 3: 70.847656 MB per loop更新
正如@WickedGrey提到的,当一个函数多次调用时,似乎有一个bug (see github issue tracker),我可以重现:
In [2]: for i in range(10):
...: %memit np.zeros(1e7)
...:
maximum of 1: 70.894531 MB per loop
maximum of 1: 70.894531 MB per loop
maximum of 1: 70.894531 MB per loop
maximum of 1: 70.894531 MB per loop
maximum of 1: 70.894531 MB per loop
maximum of 1: 70.894531 MB per loop
maximum of 1: 70.902344 MB per loop
maximum of 1: 70.902344 MB per loop
maximum of 1: 70.902344 MB per loop
maximum of 1: 70.902344 MB per loop然而,我不知道结果可能会受到多大程度的影响(在我的例子中似乎没有太多影响,所以根据你的用例,它可能仍然有用),以及这个问题何时可能得到修复。我在github上问过这个问题。
发布于 2014-07-01 21:36:00
从numpy 1.7开始,有一种半内建的方法来跟踪内存分配:
https://github.com/numpy/numpy/tree/master/tools/allocation_tracking
https://stackoverflow.com/questions/3372444
复制相似问题