使用matplotlib发生内存泄漏

mypublicdisplayname5

这并非旨在作为错误报告-即使这些泄漏可能是mpl错误的结果,也请解释问题以寻求解决方法。

问题很简单:绘制大量数据(使用plot()或scatter()),清除/释放所有内容,进行垃圾回收,但仍然不是几乎所有的内存都被释放。

Line #    Mem usage    Increment   Line Contents
================================================
391  122.312 MiB    0.000 MiB   @profile
392                             def plot_network_scatterplot(t_sim_stop, spikes_mat, n_cells_per_area, n_cells, basedir_output, condition_idx):
393
394                                  # make network scatterplot
395  122.312 MiB    0.000 MiB        w, h = plt.figaspect(.1/(t_sim_stop/1E3))
396  122.324 MiB    0.012 MiB        fig = mpl.figure.Figure(figsize=(10*w, 10*h))
397  122.328 MiB    0.004 MiB        canvas = FigureCanvas(fig)
398  122.879 MiB    0.551 MiB        ax = fig.add_axes([.01, .1, .98, .8])
399  134.879 MiB   12.000 MiB        edgecolor_vec = np.array([(1., 0., 0.), (0., 0., 1.)])[1-((spikes_mat[:,3]+1)/2).astype(np.int)]
400                                  '''pathcoll = ax.scatter(spikes_mat[:,1],
401                                             spikes_mat[:,0] + n_cells_per_area * (spikes_mat[:,2]-1),
402                                             s=.5,
403                                             c=spikes_mat[:,3],
404                                             edgecolor=edgecolor_vec)'''
405  440.098 MiB  305.219 MiB        pathcoll = ax.plot(np.random.rand(10000000), np.random.rand(10000000))
406  440.098 MiB    0.000 MiB        ax.set_xlim([0., t_sim_stop])
407  440.098 MiB    0.000 MiB        ax.set_ylim([1, n_cells])
408  440.098 MiB    0.000 MiB        plt.xlabel('Time [ms]')
409  440.098 MiB    0.000 MiB        plt.ylabel('Cell ID')
410  440.098 MiB    0.000 MiB        plt.suptitle('Network activity scatterplot')
411                                  #plt.savefig(os.path.join(basedir_output, 'network_scatterplot-[cond=' + str(condition_idx) + '].png'))
412  931.898 MiB  491.801 MiB        canvas.print_figure(os.path.join(basedir_output, 'network_scatterplot-[cond=' + str(condition_idx) + '].png'))
413                                  #fig.canvas.close()
414                                  #pathcoll.set_offsets([])
415                                  #pathcoll.remove()
416  931.898 MiB    0.000 MiB        ax.cla()
417  931.898 MiB    0.000 MiB        ax.clear()
418  931.898 MiB    0.000 MiB        fig.clf()
419  931.898 MiB    0.000 MiB        fig.clear()
420  931.898 MiB    0.000 MiB        plt.clf()
421  932.352 MiB    0.453 MiB        plt.cla()
422  932.352 MiB    0.000 MiB        plt.close(fig)
423  932.352 MiB    0.000 MiB        plt.close()
424  932.352 MiB    0.000 MiB        del fig
425  932.352 MiB    0.000 MiB        del ax
426  932.352 MiB    0.000 MiB        del pathcoll
427  932.352 MiB    0.000 MiB        del edgecolor_vec
428  932.352 MiB    0.000 MiB        del canvas
429  505.094 MiB -427.258 MiB        gc.collect()
430  505.094 MiB    0.000 MiB        plt.close('all')
431  505.094 MiB    0.000 MiB        gc.collect()

我尝试了许多组合和不同顺序的所有清除/发布都无济于事。我试过不使用显式的无花果/画布创建,而只是使用mpl.pyplot,具有相同的结果。

什么方法可以释放此内存,然后与我进来的122.312一起出去吗?

干杯!

算了吧

Alex Martelli解释

通常,对于一个过程来说,“将内存还给操作系统”是非常困难的(当然,直到该过程终止,并且操作系统会取回所有内存),因为(在大多数实现中)malloc返回的内容是多余的。块,以提高效率,但是如果其中的任何一部分仍在使用中,则无法将整个块归还。”因此,您认为内存泄漏可能只是这种情况的副作用。如果这样,fork可以解决问题。

此外

确保完成大量但临时使用内存的唯一真正可靠的方法是在完成后将所有资源返回给系统,这是在子进程中进行该使用,然后执行需要大量内存的工作,然后终止。”

因此,您不必尝试清除图形和轴,删除引用和垃圾收集(所有这些都将不起作用),而是可以multiprocessing用于plot_network_scatterplot在单独的进程中运行

import multiprocessing as mp

def plot_network_scatterplot(
    t_sim_stop, spikes_mat, n_cells_per_area, n_cells, basedir_output, 
    condition_idx):

    # make network scatterplot
    w, h = plt.figaspect(.1/(t_sim_stop/1E3))
    fig = mpl.figure.Figure(figsize=(10*w, 10*h))
    canvas = FigureCanvas(fig)
    ax = fig.add_axes([.01, .1, .98, .8])
    edgecolor_vec = np.array([(1., 0., 0.), (0., 0., 1.)])[1-((spikes_mat[:,3]+1)/2).astype(np.int)]
    '''pathcoll = ax.scatter(spikes_mat[:,1],
               spikes_mat[:,0] + n_cells_per_area * (spikes_mat[:,2]-1),
               s=.5,
               c=spikes_mat[:,3],
               edgecolor=edgecolor_vec)'''
    pathcoll = ax.plot(np.random.rand(10000000), np.random.rand(10000000))
    ax.set_xlim([0., t_sim_stop])
    ax.set_ylim([1, n_cells])
    plt.xlabel('Time [ms]')
    plt.ylabel('Cell ID')
    plt.suptitle('Network activity scatterplot')
    canvas.print_figure(os.path.join(basedir_output, 'network_scatterplot-[cond=' + str(condition_idx) + '].png'))

def spawn(func, *args):
    proc = mp.Process(target=func, args=args)
    proc.start()
    # wait until proc terminates.
    proc.join()

if __name__ == '__main__':
    spawn(plot_network_scatterplot, t_sim_stop, spikes_mat, n_cells_per_area, 
          n_cells, basedir_output, condition_idx)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用mplfinance / matplotlib时可能发生内存泄漏。怎么解决呢?

来自分类Dev

使用getline和strsep发生内存泄漏

来自分类Dev

使用NodeJS时发生内存泄漏

来自分类Dev

使用实体框架时发生内存泄漏

来自分类Dev

通过使用watchEvent发生内存泄漏

来自分类Dev

使用MBProgressHUD时发生内存泄漏

来自分类Dev

循环使用NSReadPixel时发生内存泄漏

来自分类Dev

使用DnsGetCacheDataTable时发生内存泄漏

来自分类Dev

matplotlib动画内存泄漏

来自分类Dev

在IOS中使用Web服务时,发生NSURLSession内存泄漏

来自分类Dev

在Node.js中使用流时发生内存泄漏?

来自分类Dev

在glib中使用垃圾回收时发生内存泄漏

来自分类Dev

使用Delphi的引用计数功能时发生内存泄漏

来自分类Dev

在C#中使用Powershell远程调用发生内存泄漏

来自分类Dev

在Windows上使用包XML时发生内存泄漏

来自分类Dev

在Windows上使用包XML时发生内存泄漏

来自分类Dev

使用智能指针时发生内存泄漏

来自分类Dev

使用activesocket重复连接/断开时发生内存泄漏

来自分类Dev

使用regex.h时发生内存泄漏?

来自分类Dev

使用AutomationElement类时可能发生内存泄漏

来自分类Dev

在python中使用pickle时发生内存泄漏

来自分类Dev

使用symfony2和swiftmailer发生内存泄漏

来自分类Dev

使用SinkWriter(Media Foundation)C时发生内存泄漏

来自分类Dev

在Windows上使用包XML时发生内存泄漏

来自分类Dev

使用regex.h时发生内存泄漏?

来自分类Dev

Java垃圾回收:数组发生内存泄漏(使用OpenCV)

来自分类Dev

使用shared_ptr时发生内存泄漏

来自分类Dev

如何迅速发生内存泄漏?

来自分类Dev

Android WebView发生内存泄漏

Related 相关文章

热门标签

归档