Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 使用多处理和sqlalchemy对象时,内存使用量会快速增长_Python_Sqlalchemy_Multiprocessing - Fatal编程技术网

Python 使用多处理和sqlalchemy对象时,内存使用量会快速增长

Python 使用多处理和sqlalchemy对象时,内存使用量会快速增长,python,sqlalchemy,multiprocessing,Python,Sqlalchemy,Multiprocessing,这是我关于SO的第一个问题,请耐心等待。我到处搜索,但找不到解决问题的方法,尽管有很多关于多处理和内存的文章。 我的程序使用sqlalchemy对象,这些对象与数据库中的另一个对象相连接(文章有一些实体等等),在一个步骤中,我需要为每一对文章打分,这部分有巨大的计算成本。我想使用多处理来加快速度(完成1000篇文章需要210分钟)。 最初的单进程版本消耗了750MB的内存,并且一直保持这个数量,在分成4个进程之后,每个进程的内存都会随着时间的推移而增长,达到1.5GB以上。什么会导致这样的内存消

这是我关于SO的第一个问题,请耐心等待。我到处搜索,但找不到解决问题的方法,尽管有很多关于多处理和内存的文章。 我的程序使用sqlalchemy对象,这些对象与数据库中的另一个对象相连接(文章有一些实体等等),在一个步骤中,我需要为每一对文章打分,这部分有巨大的计算成本。我想使用多处理来加快速度(完成1000篇文章需要210分钟)。 最初的单进程版本消耗了750MB的内存,并且一直保持这个数量,在分成4个进程之后,每个进程的内存都会随着时间的推移而增长,达到1.5GB以上。什么会导致这样的内存消耗?在从DB加载项目之前,我尝试生成进程,也向映射函数传递了较少的数据,但几乎没有结果。函数中的所有数据都不会在函数中更改

有问题的代码:

pool = multiprocessing.Pool()
# loading articles into self.articles, this becomes dictionary with article ids as keys
# doing some more computing, not important AFAIK
scores = pool.map(articlePairScoreWrapper, [(article1,  # instance of sqlalchemy mapped class containing references to another DB records
    article2, 
    article1.rssRecord.date,  # datetime object
    article2.rssRecord.date, 
    self.dateThreshold,  # small integer
    self.tfIdfCorpus[self.dbGensimMapper[article1.id]],  # this is quite short dictionary
    self.tfIdfCorpus[self.dbGensimMapper[article2.id]], 
    self.quotationsArt[article1.id],  # short list of strings, often empty
    self.quotationsArt[article2.id], 
    self.weights  # dictionary with 3 small items
    ) for article1, article2 in itertools.combinations(self.articles.values(), 2)])
articlePairScoreWrapper仅返回articlePairScore(*args)的值

我希望,我没有忘记任何事情,也没有太冗长,谢谢你的回答

编辑:

ps-l-y输出在运行时,由于交换太多,不得不在运行后不久将其杀死

S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S  1000 16723 11247 59  80   0 670736 322767 futex_ pts/13 00:01:48 Article_cluster
S  1000 16734 16723  5  80   0 1414648 396561 futex_ pts/13 00:00:09 Article_cluster
S  1000 16735 16723  5  80   0 1310716 377368 futex_ pts/13 00:00:09 Article_cluster
S  1000 16736 16723  5  80   0 1327292 374276 futex_ pts/13 00:00:09 Article_cluster
D  1000 16737 16723  2  80   0 965584 287491 sleep_ pts/13 00:00:05 Article_cluster

虽然我成功地优化了原始函数,并且它在没有多处理的情况下运行得很好,所以不需要解决这个问题

我怀疑这与将父内存池复制到子进程有关只是为了确保,在代码运行4个子进程时,您能发布相关的ps输出吗,感谢您的回复,我添加了ps输出,但我不确定它的好处。我对复制内存的想法完全相同,但每个进程的内存量都是原来的两倍,这也暗示了其他一些问题。非常有趣的是,使用
pool.map()
将大量(我指的是大约10^7)输入映射到某个函数也会极大地增加内存。另一方面,我在不使用多处理的情况下成功地解决了这个问题,因此可能没有必要为此浪费时间。再次感谢您的回复。如果我没记错的话,当任何子进程尝试更改父对象时,内存无法共享,必须完全复制到子进程。我认为是这样的,显然来自
ps
的值证实了这一点,每个子进程消耗大约双倍的父进程(parentmem+childmem)。我不确定,为什么子进程要消耗双倍的父进程,在开始时(由
池创建的进程,而不是函数映射),它共享父进程的数据(我在加载数据之前在函数顶部创建进程的原因),当它试图更改某些内容时(函数不更改任何内容,只进行计算)它被复制到它自己的内存中,所以最终我希望,这个孩子可以拥有和它自己的变量所需的父级+内存相同的内存量,并且它在每次迭代中都是稳定的,而每次迭代都不是,并且不断增长。这是正确的吗?