Python中文
首页
教程
问答
标签
搜索
登录
注册
优化numpy中的内存使用
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>下面的程序使用PyGame加载两个图像,将它们转换为Numpy数组,然后执行其他一些Numpy操作(例如FFT)以发出最终结果(几个数字)。输入可以很大,但在任何时候都只能有一个或两个大对象处于活动状态。在</p> <p>一个测试图像大约是10万像素,一旦被灰度化,它就转换成10MB。它被转换成一个Numpy数组<code>uint8</code>,经过一些处理(应用Hamming windows),它是一个dtype <code>float64</code>的数组。两个图像以这种方式加载到数组中;后面的FFT步骤将得到一个dtype <code>complex128</code>的数组。在添加过多的<code>gc.collect</code>调用之前,程序内存大小往往会随着每一步的增加而增加。此外,似乎大多数Numpy操作都会产生最高精度的结果。在</p> <p>在我的1GB Linux机器上运行测试(没有<code>gc.collect</code>调用)会导致长时间的震荡,这是我没有等待的。我还没有详细的内存使用统计信息——我尝试了一些Python模块和<code>time</code>命令,但是没有用;现在我要研究valgrind。观察PS(并处理测试后期的机器无响应)表明最大内存使用量约为800MB。在</p> <p>一个1000万个complex128单元阵列应该占用160MB。在同一时间(理想情况下)最多只能有两个这样的库,再加上并非虚无缥缈的Python和Numpy库以及其他工具,可能意味着可以使用500MB。在</p> <p>我可以从两个角度来解决这个问题:</p> <ul> <li><p>尽快丢弃中间数组。这就是<code>gc.collect</code>调用的目的——它们似乎已经改善了这种情况,因为它现在只需要几分钟的震荡就完成了;-)。我认为可以预期,像Python这样的语言中的内存密集型编程将需要一些手动干预。</p></li> <li><p>在每一步都使用不太精确的Numpy数组。不幸的是,返回数组的操作,如<code>fft2</code>,似乎不允许指定类型。</p></li> </ul> <p>所以我的主要问题是:<em>在Numpy数组操作中有没有指定输出精度的方法?</em></p> <p>更一般地说,在使用Numpy时是否还有其他常用的内存保存技术?在</p> <p>另外,Numpy是否有一种更惯用的释放数组内存的方法?(我想这会使数组对象保持在Python中,但处于不可用的状态。)显式删除然后立即GC会让人觉得很麻烦。在</p> <pre><code>import sys import numpy import pygame import gc def get_image_data(filename): im = pygame.image.load(filename) im2 = im.convert(8) a = pygame.surfarray.array2d(im2) hw1 = numpy.hamming(a.shape[0]) hw2 = numpy.hamming(a.shape[1]) a = a.transpose() a = a*hw1 a = a.transpose() a = a*hw2 return a def check(): gc.collect() print 'check' def main(args): pygame.init() pygame.sndarray.use_arraytype('numpy') filename1 = args[1] filename2 = args[2] im1 = get_image_data(filename1) im2 = get_image_data(filename2) check() out1 = numpy.fft.fft2(im1) del im1 check() out2 = numpy.fft.fft2(im2) del im2 check() out3 = out1.conjugate() * out2 del out1, out2 check() correl = numpy.fft.ifft2(out3) del out3 check() maxs = correl.argmax() maxpt = maxs % correl.shape[0], maxs / correl.shape[0] print correl[maxpt], maxpt, (correl.shape[0] - maxpt[0], correl.shape[1] - maxpt[1]) if __name__ == '__main__': args = sys.argv exit(main(args)) </code></pre>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p><a href="https://stackoverflow.com/questions/620428/is-there-a-way-to-reduce-scipy-numpy-precision-to-reduce-memory-consumption">This</a> 上面说“SCIPY0.8将对几乎所有的fft代码提供单精度支持”, scipy0.8.0beta1刚刚发布。<br/> (没试过,胆小鬼)</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何合并多个PDF文件?
7 回答
如何合并多个xarray数据变量及其坐标?
5 回答
如何合并多个列中具有重复值的行
4 回答
如何合并多个唯一id
8 回答
如何合并多个图纸并使用图纸名称的名称重命名列名?
6 回答
如何合并多个字典并添加同一个键的值?(Python)
4 回答
如何合并多个搜索结果文件(pkl)以将它们全部打印在一起?
9 回答
如何合并多个数据帧
4 回答
如何合并多个数据帧并使用Pandas为假人添加列?
10 回答
如何合并多个数据帧并按时间戳排序
5 回答
如何合并多个数据帧的列表并用另一个lis标记每列
7 回答
如何合并多个数据框中的列
10 回答
如何合并多个文件?
10 回答
如何合并多个查询集?
10 回答
如何合并多个绘图?
4 回答
如何合并多个词典
6 回答
如何合并多个输入数据集(数据帧)?
1 回答
如何合并多条记录中拆分的文本行
10 回答
如何合并多索引列datafram
2 回答
如何合并多级(即多索引)数据帧?
10 回答