gpt4 book ai didi

python - 长时间运行过程中 numpy tolist() 的明显内存泄漏

转载 作者:行者123 更新时间:2023-11-28 18:34:13 25 4
gpt4 key购买 nike

我运行一个服务器,作为团队内客户的数据处理节点。最近,我们一直在重构服务器中的遗留代码,以利用 numpy 进行一些过滤/转换作业。

由于我们必须将这些数据提供给远程客户端,因此我们使用 numpy.tolist() 作为中间步骤将 numpy 数据转换为各种形式。

每个查询都是无状态的,没有全局变量,因此在查询之间不会维护任何引用。

在一个特定的步骤中,我发现了明显的内存泄漏,我一直试图通过 memory_profiler 进行追踪。此步骤涉及将大型(> 4m 个条目) float ndarray 转换为 python 列表。我第一次发出查询时,tolist() 调用分配了 120m 的内存,然后在我释放 numpy 数组时释放了 31m。第二次(及后续时间)我发出相同的查询,分配/解除分配是 31m。我发出的每个不同查询都具有相同的模式,尽管具有不同的绝对值。

我已经分解了我的代码,并为了说明目的强加了一些 del 命令。下面的输出来自 memory_profiler.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 使用系统调用找出当前使用的内存量。所以你的代码可能没有问题。

关于python - 长时间运行过程中 numpy tolist() 的明显内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34022491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com