现在,我使用Python和R的组合来满足我的所有数据处理需求。但是,我的一些数据集非常大,并且会受益于多线程处理。
例如,如果每个必须在一组数百万个数据点上执行两个步骤,我希望能够在第一步仍在运行时启动第二步,使用部分已经通过第一步处理的数据。
根据我的理解,Python和R都不是这类工作的理想语言(至少,我不知道如何用这两种语言实现它)。这种类型的数据处理最好的语言/实现是什么?
答案 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)
答案 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也会对调试和优化非常有帮助。虽然引起了相当大的性能影响:)