Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止重复Python函数填充RAM空间_Python_Memory_Parallel Processing_Multiprocessing_Ram - Fatal编程技术网

防止重复Python函数填充RAM空间

防止重复Python函数填充RAM空间,python,memory,parallel-processing,multiprocessing,ram,Python,Memory,Parallel Processing,Multiprocessing,Ram,下面我有一个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.

下面我有一个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
我有几个问题想知道答案:

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

我还没有尝试过这个方法,但我确信您不需要定义

pool=mp.pool(进程=4)
在循环中,您无缘无故地启动了10个池实例。也许试着把它移开,看看你的内存使用是否会减少


如果没有帮助,请考虑重构代码以使用<代码>收益率>代码>以防止内存填充。

< Po.IMAP创建的每个新进程都需要接收有关函数的信息和应用该函数的元素。此信息为副本,因此将导致信息为副本

如果要减少它,可能需要查看pool.imap的chunksize参数

另一种方法是仅仅依赖numpy的函数。您可能已经这样做了,但您可以只做
results=test\u array*2
。我不知道您的实际示例是什么样子,但您可能不需要使用Python的池


此外,如果您打算实际编写快速代码,请不要使用TQM。它很好,如果你需要它,你也需要它,但它会减慢你的代码

您能否尝试在delete语句前后打印出内存使用情况?这个答案说明了如何做到这一点:没问题。对于上面的确切示例:before:163520512 after:164524032 in bytesThanks!我会看一下文档,看看我能用chunksize做些什么。至于函数本身,它实际上是一个几百行长的类,而不是这里给出的简单示例。我使用pool的唯一原因是为了加快函数输出速度,但是如果删除pool会话只会产生一次函数信息开销,那么这可能是一个很好的节省内存的方法。我将其移出了循环,这并没有阻止内存被填满,不幸的是,值得一试!我认为收益率不会完全起作用,因为我不会输出迭代值。相反,如果有意义的话,我会从每个过程中生成不相关的多维数组。