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>如果我没弄错的话,你在计算两幅图像之间的卷积。Scipy包包含一个专用的模块(<a href="http://docs.scipy.org/doc/scipy/reference/ndimage.html" rel="nofollow noreferrer">ndimage</a>),这可能比通过傅立叶变换的“手动”方法更节省内存。最好试着用它而不是去做裸体游戏。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
无法使用Django/mongoengine连接到MongoDB(身份验证失败)
3 回答
无法使用Django\u mssql\u后端迁移到外部hos
8 回答
无法使用Django&Python3.4连接到MySql
8 回答
无法使用Django+nginx上载媒体文件
6 回答
无法使用Django1.6导入名称模式
8 回答
无法使用Django1.7和mongodb登录管理站点
7 回答
无法使用Djangoadmin创建项目,进程使用了错误的路径,因为我事先安装了错误的Python
9 回答
无法使用Djangockedi验证CBV中的字段
3 回答
无法使用Djangocketditor上载图像(错误400)
4 回答
无法使用Djangocron进行函数调用
6 回答
无法使用Djangofiler djang上载文件
2 回答
无法使用Djangokronos
10 回答
无法使用Djangomssql provid
5 回答
无法使用Djangomssql连接到带有Django 1.11的MS SQL Server 2016
5 回答
无法使用Djangomssq迁移Django数据库
10 回答
无法使用Djangonox创建用户
7 回答
无法使用Djangopyodb从Django查询SQL Server
10 回答
无法使用Djangopython3ldap连接到ldap
3 回答
无法使用Djangoredis连接到redis
1 回答
无法使用Django中的FK创建新表
6 回答