0

我编写了一个程序来处理大约 220 万条记录的一些数据。对于每条记录,它将经过一系列 20 次计算,总共需要大约 0.01 秒。为了让它运行得更快,我使用 Python 多进程,通常将我的数据分成 6 个块,并与主进程并行运行,将有效负载分配给进程并协调执行。顺便说一句,作为计算的结果,程序将向数据库写入大约 2200 万条记录。

我在 MacBookPro i7 2.2GHz 上运行它,8GB RAM 在 Python 3.2.2 上运行。数据位于本地 MySQL 服务器上。

该程序启动良好 - 以可预测的方式运行,CPU 平均利用率为 60-70%,我的 Macbook Pro 就像烤箱一样发热。然后它在运行大约 5 小时后变慢,每个核心的 CPU 利用率下降到平均 20%。我当时所做的一些观察是: - 每个 Python 进程消耗大约 480 MB 的实际 RAM 和大约 850 MB 的虚拟 RAM。这些繁重的进程总共有 6 个 - OSX 消耗的总虚拟内存(如 Activity Monitor 所示)约为 300GB

我怀疑性能下降是由于巨大的内存消耗和潜在的高页面交换。

我怎样才能更好地诊断这些症状?长时间运行大型内存对象的 Python 有什么问题吗?真的,我不认为运行 6 小时对于今天的技术来说是沉重的,但是我只有大约半年的 Python 经验,所以......我知道什么?!

谢谢!

4

1 回答 1

0

我猜性能下降是因为它正在交换内存和内存。我认为问题不在于程序运行了多长时间 - Python 使用垃圾收集器,因此它没有内存泄漏。

嗯,这并不完全正确。垃圾收集器将确保它删除任何无法访问的内容。(换句话说,它不会删除您可以想象访问的内容。)但是,它还不够聪明,无法检测到数据结构何时不会用于程序的其余部分。您可能需要通过将所有对它的引用设置None为它才能正常工作来澄清。

  1. 你能发布相关的代码吗?

  2. 这是一个你需要不止一次给定记录的程序吗?加载记录的顺序对您的程序重要吗?

  3. 如果 python 进程只分配了几 GB 的内存,那么为什么你有 300 GB 的已用内存?

于 2012-10-21T11:51:31.133 回答