python未释放对象内存列表

2024-05-16 19:16:24 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我的python程序占用了大量内存。在

我已经简化了我的代码,这里是主要功能

points = []
read_pcd(TEST1_PCD, points)
del points[:] # i also tried del points
# program exits here 

问题是我的点云数据集很大,~100万点。我处理它,把它转换成一张海拔图,这样我就不再需要这些点了。。。 但是,分配给点的内存仍然存在。我也试过del points。正如您在内存分析器中看到的那样,删除点只释放7 Mb。。。。python是否懒得释放列表元素所占用的内存?因为我担心在我的项目后期会耗尽内存。在

这是我使用的内存分析器https://pypi.python.org/pypi/memory_profiler

以下是REF的read_pcd函数

^{pr2}$

调用时探查器输出gc.收集在

    Line #    Mem usage    Increment   Line Contents
================================================
    18   23.555 MiB    0.000 MiB   @profile
    19                             def main():
    20   24.117 MiB    0.562 MiB       rospy.init_node('traversability_analysis_node')
    21   24.125 MiB    0.008 MiB       points = []
    22 1322.914 MiB 1298.789 MiB       read_pcd(TEST1_PCD, points)
    23 1322.914 MiB    0.000 MiB       gc.collect()
    24 1315.008 MiB   -7.906 MiB       del points
    25 1315.008 MiB    0.000 MiB       time.sleep(5)

Tags: 内存代码程序pypinode分析器readline
2条回答

不幸的是,您可能无法释放所有内存:

http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

还有,试试看gc.收集(),见第二个答案:

How can I explicitly free memory in Python?

如果对象不再被引用,则会删除该对象。在

这个内存是在内部释放的,如果有一个关于相同大小的请求,以后可以再次使用。只有满足某些条件,内存才会再次返回操作系统。在

如果它是一个更大的对象,可能是内存管理决定直接从操作系统调用mmap(),从而为这个对象独占地获取内存。释放后,内存立即可用。在

如果执行del points[:],只释放内容,我不确定保存对前一个内容的引用的数组是否收缩;执行del points应该是更好的选择。在

此外,Point()可能在内部保留对所创建对象的引用(但是,我不确定它为什么要这样做)。在这种情况下,del points不会释放它们,因为它们仍在内部引用。在

相关问题 更多 >