小编Chr*_*ton的帖子

Python matplotlib:指定图形大小时未释放内存

我正在使用matplotlib生成许多数值模拟结果图.这些图用作视频中的帧,因此我通过反复调用类似于此的函数来生成许多图:

from pylab import *

def plot_density(filename,i,t,psi_Na):  
    figure(figsize=(8,6))
    imshow(abs(psi_Na)**2,origin = 'lower')
    savefig(filename + '_%04d.png'%i)
    clf()
Run Code Online (Sandbox Code Playgroud)

问题是每次调用此函数时,python进程的内存使用量会增加几兆字节.例如,如果我用这个循环调用它:

if __name__ == "__main__":
    x = linspace(-6e-6,6e-6,128,endpoint=False)
    y = linspace(-6e-6,6e-6,128,endpoint=False)
    X,Y = meshgrid(x,y)
    k = 1000000
    omega = 200
    times = linspace(0,100e-3,100,endpoint=False)
    for i,t in enumerate(times):
        psi_Na = sin(k*X-omega*t)
        plot_density('wavefunction',i,t,psi_Na)
        print i
Run Code Online (Sandbox Code Playgroud)

然后ram的使用量随着时间的推移而增长到600MB.但是,如果我figure(figsize=(8,6))在函数定义中注释掉行,则ram使用率保持稳定在52MB.(8,6)是默认的图形大小,因此在两种情况下都会生成相同的图像.我想从我的数值数据中制作不同大小的图,而不会耗尽ram.我怎么能强迫python释放这个记忆?

我已经尝试了gc.collect()每个循环强制垃圾收集,我试图f = gcf()获取当前数字然后del f删除它,但无济于事.

我在64位Ubuntu 10.04上运行CPython 2.6.5.

python memory-management matplotlib

25
推荐指数
2
解决办法
1万
查看次数

使用gtk.FileChooserDialog选择大量文件时,与平台相关的性能问题

我有一个pygtk程序,旨在运行Windows和Ubuntu.它是Python 2.7和gtk2,带有静态绑定(即没有gobject内省).我遇到的问题存在于Ubuntu上但不存在于Windows上.

我的程序应该能够处理大量文件(这里我用大约200个测试),但每个文件的实际处理并不多.我基于每个文件对处理进行排队,并向用户呈现进度.

问题是在用gtk.FileChooserDialog选择文件后(control-A是你的朋友),程序挂起并且gtk事件在很长一段时间内都没有处理 - 即使我的回调函数已经返回.在此期间,所有核心上的CPU使用率挂起约80%,iotop表明我的进程以每秒约20MB的速度写入磁盘,其他应用程序间歇性地无响应 - Chrome,Xorg,compiz,banshee和gedit都具有高CPU使用率(在选择文件之前使用率很低).

这是一些示例代码.要重现,请单击按钮,从某处选择大约200个文件(大约十个屏幕保持移位和向下),然后单击"确定".什么文件无关紧要 - 没有用它们做什么.

import gtk,gobject,time

def print_how_long_it_was_frozen():
    print time.time() - start_time

def button_clicked(button):
    dialog = gtk.FileChooserDialog(
                'Select files to add', w, gtk.FILE_CHOOSER_ACTION_OPEN,
                buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                         gtk.STOCK_OPEN, gtk.RESPONSE_OK))
    dialog.set_select_multiple(True)
    dialog.set_default_response(gtk.RESPONSE_OK)
    response = dialog.run()
    files = dialog.get_filenames()
    dialog.destroy()
    for i, f in enumerate(files):
        print i

    global start_time
    start_time = time.time()
    gobject.idle_add(print_how_long_it_was_frozen)


w = gtk.Window() 
b = gtk.Button('Select files')
w.add(b)
b.connect('clicked', button_clicked)
w.show_all()
gtk.main()
Run Code Online (Sandbox Code Playgroud)

这导致回调结束约60秒挂起,在此期间除了处理对话框的破坏(在挂起的中途发生)之外什么都不应该发生.

这是在Ubuntu 11.10上.在Windows上,挂起的时间不到一秒钟.

我怀疑这是由于某些Gnome或Unity最近的文件功能,或其他活动跟踪.该过程zeitgeist-daemon在挂起期间也具有较高的CPU使用率,但是杀死它并不能解决问题.也没有使用Zeitgeist活动日志管理器禁用日志记录.即使可以禁用Zeitgeist,我也不能指望我的用户禁用它. …

python filesystems gtk ubuntu

5
推荐指数
1
解决办法
696
查看次数