Python多处理大量数据

时间:2014-03-19 16:58:02

标签: python multiprocessing

我搜索过该网站,但我不确定哪些条款会产生相关答案,如果这个问题多余,我会道歉。

我需要处理一个非常大的矩阵(14,000,000 * 250,000),并希望利用Python的多处理模块来加快速度。对于矩阵中的每对列,我需要应用一个函数,然后将结果存储在专有类中。

我将实现一个双四循环,它提供了必要的列组合。

我不想加载一个包含250,000个任务的池,因为我担心内存使用量会很大。理想情况下,我希望有一个列然后在池中进行任务I.e 过程1采用A列和B列,函数F采用A,B和G,然后将结果存储在G类[A,B]中 过程2采用A列和C列并以类似方式进行

进程永远不会访问G的相同元素。

所以我想暂停每N个任务的for循环。 G的set / get方法将被覆盖以执行一些后端任务。

我不明白是否需要暂停循环?我是Python足够智能,只能采取它可以工作的东西?或者它会填充大量的任务吗?

最后,我不清楚结果如何运作。我只是希望将它们设置在G中而不返回任何内容。我不想担心.get()等等,但根据我的理解,pool方法返回一个结果对象。我可以忽略这个吗?

有更好的方法吗?我完全失去了吗?

1 个答案:

答案 0 :(得分:1)

首先关闭 - 您将需要创建一个多处理池类。您可以设置所需的工作人员数量,然后使用地图启动任务。我相信你已经知道了,但这里是python multiprocessing docs。

您说您不想退回数据,因为您不需要,但您打算如何查看结果?每个任务都会将数据写入磁盘吗?要在您的流程之间传递数据,您需要使用multiprocessing queue之类的内容。

以下是关于如何使用进程和队列的链接的示例代码:

from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print q.get()    # prints "[42, None, 'hello']"
    p.join()

这是使用Pool的一个例子:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)              # start 4 worker processes
    result = pool.apply_async(f, [10])    # evaluate "f(10)" asynchronously
    print result.get(timeout=1)           # prints "100" unless your computer is *very* slow
    print pool.map(f, range(10))          # prints "[0, 1, 4,..., 81]"

编辑:@goncalopp非常重要,因为它有多慢,你可能不想在python中进行繁重的数值计算。 Numpy是进行数字运算的绝佳方法。

如果由于在每个进程上写入磁盘而导致IO严重受限,则应考虑运行类似4 * num_processors的操作,以便始终可以执行某些操作。你还应该确保你有一个非常快的磁盘:)

相关问题