多线程数据工作的推荐语言

时间:2010-08-17 22:22:11

标签: python multithreading r

现在,我使用Python和R的组合来满足我的所有数据处理需求。但是,我的一些数据集非常大,并且会受益于多线程处理。

例如,如果每个必须在一组数百万个数据点上执行两个步骤,我希望能够在第一步仍在运行时启动第二步,使用部分已经通过第一步处理的数据。

根据我的理解,Python和R都不是这类工作的理想语言(至少,我不知道如何用这两种语言实现它)。这种类型的数据处理最好的语言/实现是什么?

6 个答案:

答案 0 :(得分:6)

可以使用multiprocessing模块在​​Python中执行此操作 - 这会生成多个进程而不是线程,这会绕过GIL,从而允许真正的并发。

这并不是说Python是这项工作的“最佳”语言;这是一个可以争论的主观观点。但它肯定有能力。

编辑:是的,有几种方法可以在进程之间共享数据。管道是最简单的;它们是类似文件的句柄,一个进程可以写入,然后另一个进程可以读取。直接来自文档:

from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join()

例如,您可以让一个进程执行第一步,然后将结果通过管道发送到另一个进程进行第二步。

答案 1 :(得分:5)

使用R进行多处理非常容易(或者绝对不比Python更难);查看multicore包和其他列出的here

答案 2 :(得分:3)

我发现使用带有foreach包的R实际上是一种在代码中使用多线程的简单方法。如果您分别具有类似UNIX的窗口,请使用doMC或doMPI程序包作为并行后端。小插图应该让你快速前进。这种方法最适合并行化循环,我发现在我的机器上使用8个核心中的7个通常可以提高近6倍的速度。我不确定你是否可以根据第一个过程开始第二个过程,但值得快速查看。

祝你好运。很抱歉,我是新用户,只能发布一个链接,或者我也会链接所有其他页面。

答案 3 :(得分:1)

在Python方面,你最好的选择可能是在两个不同的进程中分开两个步骤。有几个模块可以帮助您实现这一目标。您可以通过管道将两个进程耦合在一起。为了通过管道传递任意数据,您需要对其进行序列化和反序列化。 pickle 模块将是一个很好的候选者。

如果你想跳船,像Erlang,Haskell,Scala或Clojure这样的语言可能有你想要的并发功能,但我不知道它们与R或其他适合你的统计软件包的集成程度如何

答案 4 :(得分:0)

如果我没记错的话(但我可能在这里错了),Ada95的主要目的之一就是并行处理。有趣的语言,就是这样。

抛开笑话我不太确定它会有多么好的性能(但是现在看到你使用的是Python它应该不会那么糟糕)但我建议使用Java,因为多线程的基础很简单(但是编写一个编写良好的复杂多线程应用程序相当困难)。听说Concurrency库也很不错,不过我自己还没试过。

答案 5 :(得分:0)

我对Java多线程的经验非常积极,尽管它确实需要很多时间来适应。在一天结束时,最大的问题不是语法或java功能,而是开发多线程代码所需的不同心态。

如果您正在使用eclipse,那么a profiling suite也会对调试和优化非常有帮助。虽然引起了相当大的性能影响:)