Python守护进程进程内存管理

Python守护进程进程内存管理,python,memory,dictionary,freebsd,python-daemon,Python,Memory,Dictionary,Freebsd,Python Daemon,我目前正在编写一个Python守护进程,它实时监视日志文件,并根据结果更新Postgresql数据库中的条目。该过程只关心出现在日志文件中的唯一密钥以及从该密钥中看到的最新值 我使用轮询方法,每10秒处理一个新批。为了减少整个数据集,以避免对数据库进行无关的更新,我只将密钥和最新值存储在dict中。根据过去10秒内的活动量,此dict可以从10-1000个唯一条目变化。然后dict被“处理”,这些结果被发送到数据库 我主要关心的是内存管理和一段时间(几天、几周等)的dict。由于这是一个持续运行

我目前正在编写一个Python守护进程,它实时监视日志文件,并根据结果更新Postgresql数据库中的条目。该过程只关心出现在日志文件中的唯一密钥以及从该密钥中看到的最新值

我使用轮询方法,每10秒处理一个新批。为了减少整个数据集,以避免对数据库进行无关的更新,我只将密钥和最新值存储在dict中。根据过去10秒内的活动量,此dict可以从10-1000个唯一条目变化。然后dict被“处理”,这些结果被发送到数据库

我主要关心的是内存管理和一段时间(几天、几周等)的dict。由于这是一个持续运行的守护进程,内存使用量会根据dict的大小而膨胀,但不会适当收缩。我尝试过在处理批处理后使用标准解引用和dict.clear()方法重置dict,但没有注意到内存使用量的变化(FreeBSD/top)。强制执行gc.collect()似乎可以恢复一些内存,但通常仅恢复50%左右

你们对我该怎么做有什么建议吗?在我的过程中还有什么我可以做的吗?如果您在问题周围看到不同的道路,请随时插话:)

当您清除()dict或删除dict引用的对象时,包含的对象仍在内存中。如您所见,如果它们没有在任何地方被引用,则可以对它们进行垃圾收集,但垃圾收集不会在del或clear()上显式运行

我为您找到了类似的问题:。简言之,如果你没有内存不足,你真的不需要为此担心太多。FreeBSD本身在处理虚拟内存方面做得很好,因此即使您的Python程序中有大量过时的对象,您的计算机也可能不会切换到磁盘。

当您清除()dict或删除dict引用的对象时,包含的对象仍在内存中。如您所见,如果它们没有在任何地方被引用,则可以对它们进行垃圾收集,但垃圾收集不会在del或clear()上显式运行


我为您找到了类似的问题:。简言之,如果你没有内存不足,你真的不需要为此担心太多。FreeBSD本身在处理虚拟内存方面做得很好,因此即使您的Python程序中有大量过时的对象,您的计算机也可能不会切换到磁盘。

您使用的是哪种Python版本?Python2.5旧版将保留峰值内存使用率,操作系统永远不会回收它。我正在运行Python2.7.2我建议您使用Heapy来调试代码中的内存泄漏:您的守护进程是否在while循环中运行?如果是这样,您是在启动while循环之前还是之后重置字典,如myDict={}?如果是以前,这可能就是它没有正确分配内存的原因。发布一些代码会很有用。否则,您可以尝试分析代码。您可以在守护进程运行时监视位于/proc/“PID#”/status目录中的虚拟内存和驻留内存的增长。这可能会让人们更清楚地了解什么在增长,以及它的趋势如何。python的cProfile也是useful@mshell_lauren是的,dict在init中初始化,并在while循环中重置。但是,我一直在解释器中进行测试,没有进行while循环,没有看到任何变化。您使用的是哪种Python版本?Python2.5旧版将保留峰值内存使用率,操作系统永远不会回收它。我正在运行Python2.7.2我建议您使用Heapy来调试代码中的内存泄漏:您的守护进程是否在while循环中运行?如果是这样,您是在启动while循环之前还是之后重置字典,如myDict={}?如果是以前,这可能就是它没有正确分配内存的原因。发布一些代码会很有用。否则,您可以尝试分析代码。您可以在守护进程运行时监视位于/proc/“PID#”/status目录中的虚拟内存和驻留内存的增长。这可能会让人们更清楚地了解什么在增长,以及它的趋势如何。python的cProfile也是useful@mshell_lauren是的,dict在init中初始化,并在while循环中重置。然而,我一直在解释器中测试,没有一个while循环,没有看到任何变化。。