返回时python多进程池映射失败

时间:2014-07-25 09:53:59

标签: python multiprocessing pool

我正在尝试利用多处理库利用Python 2.7解析数据中的并行化。手头的任务是读取大量大型数据文件并将其内容作为字典或列表返回。问题是当我尝试从我的函数返回时,发送回已解析的数据,我的机器(在Ubuntu Linux中运行)挂起,内存和负载指示器处于最大值。

代码执行类似这样的操作

import multiprocessing as mp

def worker(filex):
    """ reading lots of data """

    raw = filter(lambda x: len(x.split())>3,
        open(filex).readlines())
    data = {}
    ... # putting all the data in the data dictionary
    return data

# multiprocessing options
nproc = mp.cpu_count()
pool = mp.Pool(processes=nproc)
traj = pool.map(worker, tuple(files_to_parse))
pool.close()

大数据结构是产生问题的结构。有趣的是,如果我返回其他代码,那么即使我传递的数据结构是空的。使用数据作为列表而不是字典没有帮助。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您的计算机不会挂起,但可以使用其所有容量来完成您的程序,因此一切都按预期工作。最终,您的计算机应该完成它的任务。

话虽如此,你可以做一些事情:

  • 提高处理速度。对于CPU密集型程序,Python作为一种语言,而Python的json模块可能不是最合适的。您真的需要将整个文档解析为 Python对象吗?
  • 不要使用多处理。使用线程应用程序,您可以只使用一个核心(至少如果您的Python解释器使用GIL,但是您不会有腌制和取消Python对象的开销以将它们从一个进程传输到另一个进程。
  • 为什么不对工人进行实际处理?您真的需要在原始流程的内存中使用所有这些巨大的数据结构吗?
  • 如果这不是一个选项,请考虑使用imap甚至imap_unordered而不是map。如果您的主进程可以比下载和解析数据结构更快地处理数据结构,那么内存压力应该保持不变。
  • nice您的Python进程(所有这些进程或只是池创建的进程),以便让系统的其余部分以更高的优先级运行。这不会使你的程序更快(事实上,它通常会减慢它),但应该让你的系统上的其他程序(包括你的用户界面)反应更快。
  • 使用更快或更多的CPU和RAM。
  • 在多台计算机上分配工作。 multiprocessing does not support that directly,但有一些Python projects that enable cluster processing