【问题标题】:Recommended language for multithreaded data work多线程数据工作的推荐语言
【发布时间】:2010-08-17 22:22:10
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以使用哪些平台和其他语言选项?

标签: python multithreading r


【解决方案1】:

可以在 Python 中使用 multiprocessing 模块执行此操作——这会产生多个进程而不是线程,从而绕过 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()

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

【讨论】:

  • 但这是否允许我以我描述的方式共享状态数据?我的印象是这是多处理模块/GIL 的缺点。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我发现将 R 与 foreach 包一起使用确实是在代码中使用多线程的一种简单方法。如果您分别拥有类 UNIX 或 Windows,则使用 doMC 或 doMPI 包作为并行后端。小插曲应该让你走得相当快。这种方法最适合并行化 for 循环,我发现在我的机器上使用 8 个内核中的 7 个通常可以将速度提高近六倍。我不确定您是否可以根据第一个过程的结果开始第二个过程,但值得快速查看。

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

    【讨论】:

      【解决方案4】:

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

      如果您想跳槽,Erlang、Haskell、Scala 或 Clojure 等语言可能具有您正在寻找的并发特性,但我不知道它们与 R 或其他适合您的统计软件包的集成程度如何.

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我对 Java 多线程的体验非常积极,尽管它确实需要很多时间来适应。归根结底,最大的问题不是语法或 java 特性,而是开发多线程代码所需的不同思维方式。

          如果您使用的是 eclipse,那么还有 a profiling suite 这对调试和优化非常有帮助。虽然会导致相当大的性能损失:)

          【讨论】:

            猜你喜欢
            • 2015-09-25
            • 2011-08-21
            • 2016-01-19
            • 1970-01-01
            • 1970-01-01
            • 2011-10-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多