使用multiprocessing创建的子进程会共享在程序之前创建的对象吗?
我的设置如下:
do_some_processing(filename):
for line in file(filename):
if line.split(',')[0] in big_lookup_object:
# something here
if __name__ == '__main__':
big_lookup_object = marshal.load('file.bin')
pool = Pool(processes=4)
print pool.map(do_some_processing, glob.glob('*.data'))
我正在将一些大型对象加载到内存中,然后创建一个工作进程池来利用该大型对象。这个大型对象是只读的,我不需要在进程之间传递它的修改。我的问题是:这个大型对象会被加载到共享内存中吗?就像在unix/c中生成进程时那样,还是每个进程都会加载自己的大型对象?
更新:进一步澄清 - big_lookup_object 是一个共享的查找对象。我不需要将其拆分并单独处理。我需要保留单个副本。我需要拆分的工作是读取许多其他大型文件,并根据查找对象在这些大型文件中查找项目。
进一步更新:数据库是一个好的解决方案,memcached 可能更好,磁盘上的文件(shelve 或 dbm)可能甚至更好。在这个问题中,我特别感兴趣的是一个内存中的解决方案。对于最终的解决方案,我将使用 hadoop,但我也想看看是否可以有一个本地的内存版本。
marshal.load
。 - jfsbig_lookup_object
作为参数传递给do_some_processing
函数。当你想要将lambda表达式传递给Pool.map()
或普通的Pythonmap
函数时,这也非常有用。 - chess