相关疑难解决方法(0)

是否有适用于Python3的工作内存分析器

在Python 2中有一些工具,但一切似乎都是旧的和过时的.

我发现了PySizer和Heapy但是一切似乎都是面向Python2的,需要付出很多努力来移植.

objgraph很有趣,但仍然不是一个完全工作的分析器

使用哪种工具?

python profiling memory-profiling memory-leak-detector python-3.x

33
推荐指数
1
解决办法
9116
查看次数

Python3:程序占用的内存比预期的多得多

我的python程序占用了比预期更多的内存或由内存分析工具返回.我需要一个策略来查找内存泄漏并修复它.

详细

我在64位Linux机器上运行python3脚本.几乎所有代码都捆绑在一个对象中:

obj = MyObject(*myArguments)
result = obj.doSomething()
print(result)
Run Code Online (Sandbox Code Playgroud)

在创建过程中obj,程序会读取大小为ca.的文本文件.100MB.由于我以多种方式保存信息,我希望整个对象占用几个hundret MB内存.

实际上,用asizeof.asized(obj)pympler测量它的大小返回大约123MB.但是,top告诉我我的程序占用大约1GB的内存.

我知道方法中的局部变量会占用更多的RAM.但是,查看我的代码,我发现这些局部变量都不会那么大.我asizeof.asized再次使用双重检查.

我不担心脚本需要1GB的内存.但是,我并行执行了一些方法(在12个方面):

class MyObject()

    def doSomething(arg):
        # do something

    def myParallelMethod(args)
        with sharedmem.MapReduce() as pool:
            result = pool.map(self.doSomething, args)
        return result
Run Code Online (Sandbox Code Playgroud)

这使得总内存使用量变为8GB,即使我将所有大对象放在共享内存中:

self.myLargeNumPyArray = sharedmem.copy(self.myLargeNumPyArray)
Run Code Online (Sandbox Code Playgroud)

我向测试程序保证内存真的是共享的.

检查asizeof,我在每个子进程中获得了

  • asizeof.asized(self) 是1MB(即比"原始"对象小得多 - 可能是由于共享内存,不计算两倍)
  • asizeof.asized(myOneAndOnlyBigLocalVariable) 是230MB.

总而言之,我的程序应该占用不超过123MB + 12*230MB = 2.8GB << 8GB.那么,为什么程序需要这么多内存呢?

一种解释可能是当程序并行运行时,我的对象中存在一些被隐藏的部分(垃圾?).

有没有人知道找出内存泄漏的策略?我该怎么办呢?

我已阅读有关内存分析多个线程,例如剖析内存在Python 3,是否有工作存储器剖析了Python3, …

python memory profiling multiprocessing memory-profiling

5
推荐指数
0
解决办法
693
查看次数