首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中配置内存分配(支持Numpy数组)

在Python中配置内存分配(支持Numpy数组)
EN

Stack Overflow用户
提问于 2010-07-30 22:30:33
回答 5查看 4.6K关注 0票数 27

我有一个包含大量对象的程序,其中许多是Numpy数组。我的程序交换得很糟糕,我正在努力减少内存使用量,因为它实际上无法在我的系统上完成当前的内存需求。

我正在寻找一个很好的分析器,它可以让我检查各种对象消耗的内存量(我正在设想一个与cProfile对应的内存),这样我就知道在哪里进行优化。

我听说过关于Heapy的一些不错的事情,但不幸的是,Heapy不支持Numpy数组,而且我的大部分程序都涉及Numpy数组。

EN

回答 5

Stack Overflow用户

发布于 2013-10-11 15:25:27

如果您正在调用许多不同的函数,并且不确定交换来自何处,那么解决此问题的一种方法是使用memory_profiler的新绘图功能。首先,您必须对@profile使用的不同函数进行修饰。为简单起见,我将使用memory_profiler附带的示例examples/numpy_example.py,其中包含两个函数:create_data()process_data()

要运行脚本,请使用mprof可执行文件,而不是使用Python解释器运行脚本

代码语言:javascript
复制
$ mprof run examples/numpy_example.py

这将创建一个名为mprofile_??????????.dat的文件,其中?将保存表示当前日期的数字。要绘制结果,只需输入mprof plot,它将生成类似如下的图形(如果您有多个.dat文件,它将始终采用最后一个文件):

在这里,您可以看到内存消耗,其中的括号表示您何时进入/退出当前函数。这样就很容易看出函数process_data()有一个内存消耗的峰值。要进一步深入研究函数,可以使用逐行分析器查看函数中每行的内存消耗情况。这是通过运行的

代码语言:javascript
复制
python -m memory_profiler examples/nump_example.py

这将为您提供类似以下内容的输出:

代码语言:javascript
复制
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正在分配大量的内存。

票数 12
EN

Stack Overflow用户

发布于 2013-10-09 05:38:03

看看memory profiler吧。它提供了逐行分析和Ipython集成,这使得它非常容易使用:

代码语言:javascript
复制
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),我可以重现:

代码语言:javascript
复制
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上问过这个问题。

票数 10
EN

Stack Overflow用户

发布于 2014-07-01 21:36:00

从numpy 1.7开始,有一种半内建的方法来跟踪内存分配:

https://github.com/numpy/numpy/tree/master/tools/allocation_tracking

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3372444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档