我正在研究需要进程的代码,我对每个进程使用的内存感到惊讶。我没有关于进程和线程的广泛知识,也许它确实合乎逻辑,但我找不到内存消耗的原因,以及如何减少它。
以下代码创建一个大的'info'变量,并创建几乎没有信息的5个进程:
from multiprocessing import Process, Manager
import time
def proc(speific_list, some_info):
time.sleep(10)
def jobs():
manager = Manager()
specific_list = manager.list()
jobs = []
info = "Hello"
for i in xrange(0,25):
info += info
for job_id in xrange(0,5):
d = Process(name='proc', target=proc, args=(specific_list, 35))
d.daemon = True
d.start()
jobs.append(d)
for job in jobs:
job.join()
if __name__ == '__main__':
jobs()
问题是主进程将有大约170MB的'info'变量,并且不会将其发送到其他进程。但是每个进程都需要170MB,即使我从未发送过这个变量。现在我使用一个非常难看的解决方案来避免这个问题 - 使用文件,在创建进程之前销毁'info',只读取文件中需要的东西 - 但这只是一个补丁,肯定有另一个解决方案。
编辑:
对于我的特定情况,'info'是一个600MB的列表,每个进程都会收到'info'的一部分,一个工作的解决方案似乎将列表复制到manager.list()并销毁最初的'info'。这样我可以减少内存使用量。但我希望有一个解决方案适用于更一般的项目。在创建流程之前删除最大的变量并不方便 - 也不总是可行。