【问题标题】:Prevent RAM space from filling from repeated Python function防止重复的 Python 函数填充 RAM 空间
【发布时间】:2019-10-09 15:01:57
【问题描述】:

我在下面有一个 Python 函数示例,它只接受一个变量并在返回之前对其执行简单的数学运算。

如果我并行化这个函数,以更好地反映我想在现实生活中执行的操作,并运行并行化函数 10 次,我注意到在我的 IDE 上,尽管使用了 del results 行,内存还是增加了。

import multiprocessing as mp
import numpy as np
from tqdm import tqdm

def function(x):
        return x*2

test_array = np.arange(0,1e4,1)

for i in range(10):

        pool = mp.Pool(processes=4)
        results = list(tqdm(pool.imap(function,test_array),total=len(test_array)))
        results = [x for x in results if str(x) != 'nan']

        del results

我有几个问题希望知道答案:

  • 有没有办法防止这种内存增加?
  • 这是由于并行化过程导致的内存加载吗?

【问题讨论】:

  • 能否尝试打印出delete语句前后的内存使用情况?这个答案显示了如何做到这一点:stackoverflow.com/questions/938733/…
  • 没问题。对于上面的确切示例:之前:163520512 之后:164524032(以字节为单位)

标签: python memory parallel-processing multiprocessing ram


【解决方案1】:

我还没有尝试过,但我很确定你不需要定义

pool= mp.Pool(processes=4)

在循环中,您无缘无故地启动了 10 个池实例。也许尝试将其移出并查看您的内存使用量是否减少?

如果这没有帮助,请考虑重组代码以使用yield,以防止内存填满。

【讨论】:

  • 我把它移到了循环之外,不幸的是,这并没有阻止内存填满,但值得一试!我不认为 yield 会起作用,因为我没有输出迭代值。如果有意义的话,我将从每个进程中生成不相关的多维数组。
【解决方案2】:

pool.imap 创建的每个新进程都需要接收一些关于函数的信息以及它应用函数的元素。此信息是副本,因此将导致信息成为副本。

如果你想减少它,你可能想看看 pool.imap 的 chunksize 参数。

另一种方法是仅依赖 numpy.你现在可能已经,但你可以做results = test_array * 2。我不知道您的真实示例是什么样的,但您可能不需要使用 Python 的池。

另外,如果您打算真正编写快速代码,请不要使用 tqdm。这很好,如果你需要它,你需要它,但它会减慢你的代码。

【讨论】:

  • 感谢您的回复!我会看一下文档,看看我可以用 chunksize 做什么。至于函数本身,它实际上是几百行长的类,而不是不幸的是这里给出的简单示例。我使用池的唯一原因是加快函数输出,但如果删除池会话只会创建一次函数信息开销,那么这可能是节省内存的好方法。
猜你喜欢
  • 1970-01-01
  • 2018-11-11
  • 2011-04-26
  • 2021-12-01
  • 2014-02-13
  • 2023-01-10
  • 2018-04-02
  • 1970-01-01
  • 2015-09-06
相关资源
最近更新 更多