代码之家  ›  专栏  ›  技术社区  ›  chimeracoder

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

  •  6
  • chimeracoder  · 技术社区  · 16 年前

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

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

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

    6 回复  |  直到 16 年前
        1
  •  6
  •   Katriel    16 年前

    在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()
    

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

        2
  •  5
  •   mbq    16 年前

    使用r进行多处理非常容易(或者肯定不会比使用python更难);请查看 multicore 包装和其他清单 here .

        3
  •  3
  •   user399470    16 年前

    我发现用R和 foreach 包实际上是在代码中使用多线程的一种简单方法。如果您分别拥有一个类似于Unix或Windows,那么使用domc或dompi包作为并行后端。小插曲会让你走得相当快。这种方法最适合于对循环进行并行化,我发现在我的机器上使用8个核心中的7个通常可以提高近6倍的速度。我不确定您是否可以根据第一个流程的结果启动第二个流程,但值得快速查看。

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

        4
  •  1
  •   ThomasH    16 年前

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

    如果你想跳槽,像erlang、haskell、scala或clojure这样的语言可能有你想要的并发特性,但是我不知道它们与r或其他一些适合你的统计软件包有多好的集成。

        5
  •  0
  •   Mateusz Dymczyk    16 年前

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

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

        6
  •  0
  •   Michael Clerx    16 年前

    我对Java多线程的体验是非常积极的,尽管它需要花费很多时间。在一天结束时,最大的问题不是语法或Java特性,而是需要开发多线程代码的不同心态。

    如果你使用Eclipse,还有 a profiling suite 这对调试和优化非常有帮助。但会造成相当大的性能损失:)