python - 为什么在使用 multiprocessing.Process 和共享内存时内存使用量会突然飙升?
问题描述
我正在运行一个 Python ( python3
) 脚本,该脚本同时生成(使用fork
和不使用spawn
)大量进程multiprocessing.Process
(例如,其中的 20-30 个)。我确保所有这些过程都完成(.join()
)并且不会变成僵尸。但是,尽管我使用相同的随机种子运行相同的代码,但由于内存使用量在完全随机的时间出现巨大的峰值,我的工作崩溃了(内存使用量从请求的14GB上升到30GB到200GB之间的随机值s 突然)。有时我的作业/脚本在运行 10 分钟后崩溃,有时在刚开始时崩溃),有时在运行 10 小时后崩溃。请注意,这个过程是确定性的,我可以重复它但不能重现崩溃,这很奇怪。我对这些进程中的每一个所做的是使用cv2.imread
(每个可能占用 0.5MB 内存)从磁盘加载图像并将它们存储到共享内存中(mp.RawArray('f', 3*224*224)
或mp.Array('f', 3*224*224)
) 我在运行进程之前创建的!我的代码每分钟在我运行它的服务器上创建和处理大约 1500-2000 个这些图像。看到有时只有 100-150 个图像从磁盘读取,但工作一开始就崩溃,因为当我将工作提交到使用 CentOS 的服务器时,我请求 25GB 的内存,这很烦人。
我已经尝试在我们的服务器上增加请求的内存(从 25GB 到 115GB),但是我的脚本很快或很晚并且在完全随机的时间崩溃。我注意到的另一件事是,尽管我生成了许多进程并.start()
同时执行,但其中大多数进程直到先生成的进程首先完成后才开始运行。这是因为我在运行我的工作并使用 8 个内核时不需要很多内核(例如 30 个)。
我想知道人们是否有过类似的经历?我将不胜感激您的意见/建议。