2

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

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

我主要关心的是内存管理和随着时间的推移(几天、几周等)的字典。由于这是一个不断运行的守护进程,内存使用量会根据字典的大小而膨胀,但不会适当缩小。我尝试使用标准取消引用重置 dict,并在处理批处理后使用 dict.clear() 方法,但注意到内存使用没有变化(FreeBSD/top)。似乎强制 gc.collect() 确实恢复了一些内存,但通常只有 50% 左右。

你们对我应该如何进行有什么建议吗?在我的过程中我还能做些什么吗?如果您看到围绕该问题的不同道路,请随时加入 :)

4

1 回答 1

0

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

我为您找到了类似的问题:https ://stackoverflow.com/questions/996437/memory-management-and-python-how-much-do-you-need-to-know 。简而言之,如果您没有内存不足,您真的不需要为此担心太多。FreeBSD 本身在处理虚拟内存方面做得很好,因此即使您的 Python 程序中有大量陈旧的对象,您的机器也可能不会交换到磁盘。

于 2012-02-01T01:24:15.073 回答