我运行一个服务器,充当团队内客户端的数据处理节点。最近我们一直在重构服务器内的遗留代码以利用numpy对于一些过滤/转换作业。
由于我们必须将这些数据提供给远程客户端,因此我们使用以下方法将 numpy 数据转换为各种形式:numpy.tolist()作为中间步骤。
每个查询都是无状态的,没有全局变量,因此在查询之间不维护任何引用。
在一个特定步骤中,我遇到了明显的内存泄漏,我一直试图通过内存分析器。此步骤涉及将大型(>4m 条目)浮点数 ndarray 转换为 python 列表。我第一次发出查询时, tolist() 调用分配 120m 内存,然后在释放 numpy 数组时释放 31m 内存。第二次(以及随后的几次)我发出相同的查询,分配/释放是 31m。我发出的每个不同查询都具有相同的模式,但绝对值不同。
我已经拆解了我的代码,并出于说明目的强行输入了一些 del 命令。下面的输出来自内存分析器.profile
第一期查询:
Line # Mem usage Increment Line Contents
================================================
865 296.6 MiB 0.0 MiB p = ikeyData[1]['value']
866 417.2 MiB 120.6 MiB newArr = p.tolist()
867 417.2 MiB 0.0 MiB del p
868 385.6 MiB -31.6 MiB del ikeyData[1]['value']
869 385.6 MiB 0.0 MiB ikeyData[1]['value'] = newArr
同一查询的第二个(及后续)实例:
Line # Mem usage Increment Line Contents
================================================
865 494.7 MiB 0.0 MiB p = ikeyData[1]['value']
866 526.3 MiB 31.6 MiB newArr = p.tolist()
867 526.3 MiB 0.0 MiB del p
868 494.7 MiB -31.6 MiB del ikeyData[1]['value']
869 494.7 MiB 0.0 MiB ikeyData[1]['value'] = newArr
正如您可以想象的那样,在具有高度可变查询的长期运行过程中,这些分配会迫使我们定期跳动服务器。
有人对这里可能发生的事情有想法吗?
在你的情况下,Python 可能已经释放了内存。
这并不意味着内存分配器一定会返回内存
到操作系统。memory_profiler
使用系统调用来找出当前已使用的内存量。所以你的代码可能没有问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)