7

我目前正在设计一个应用程序,该应用程序具有一个模块,该模块将从数据库中加载大量数据,并根据情况通过各种计算将其减少到更小的集合。

许多更密集的操作具有确定性,并且适合并行处理。

如果我有一个循环遍历从数据库到达的大量数据块,并且每个数据块都调用一个没有副作用的确定性函数,我将如何制作它以便程序不等待函数返回而是设置下一个电话,所以他们可以并行处理?一种天真的方法来证明这个原则现在对我有用。

我已经阅读了 Google 的 MapReduce 论文,虽然我可以在很多地方使用总体原理,但我现在不会针对大型集群,而是将其作为 1.0 版的单个多核或多 CPU 机器. 所以目前,我不确定我是否可以真正使用该库,或者自己必须推出一个简化的基本版本。

我处于设计过程的早期阶段,到目前为止,我将 C-something(用于速度关键位)和 Python(用于生产力关键位)作为我的语言。如果有令人信服的理由,我可能会切换,但到目前为止我对我的选择感到满意。

请注意,我知道从数据库中检索下一个块可能比处理当前块需要更长的时间,然后整个过程将受 I/O 限制。但是,我现在假设它不是,并且在实践中使用数据库集群或内存缓存或其他东西在这一点上不受 I/O 限制。

4

9 回答 9

3

好吧,如果 .net 是一个选项,他们已经在Parallel Computing上投入了很多精力。

于 2008-09-11T14:58:23.007 回答
3

您可以从 Google 的MapReduce实现该算法,而无需物理上独立的机器。只需将这些“机器”中的每一个都视为“线程”。线程自动分布在多核机器上。

于 2008-09-11T14:58:58.920 回答
3

如果您仍打算使用 Python,您可能想看看Processing。它使用进程而不是线程进行并行计算(由于 Python GIL),并提供用于将“工作项”分配到多个进程的类。使用 pool 类,您可以编写如下代码:

import processing

def worker(i):
    return i*i
num_workers = 2
pool = processing.Pool(num_workers)
result = pool.imap(worker, range(100000))

这是 itertools.imap 的并行版本,它将调用分配给进程。您还可以使用池的 apply_async 方法并将惰性结果对象存储在列表中:

results = []
for i in range(10000):
    results.append(pool.apply_async(worker, i))

如需进一步参考,请参阅Pool 类的文档

陷阱:

  • 处理使用 fork(),所以你必须小心 Win32
  • 在进程之间传输的对象需要是可腌制的
  • 如果工人相对较快,您可以调整块大小,即一批发送到工作进程的工作项数
  • processing.Pool 使用后台线程
于 2008-09-15T19:57:34.130 回答
2

如果您正在使用支持它的编译器,我建议您查看http://www.openmp.org,了解一种注释代码的方式,以使某些循环可以并行化。

它还有更多功能,您可能会发现它很有帮助。

例如,他们的网页报告说 gcc4.2 将支持 openmp。

于 2008-09-11T17:34:59.997 回答
2

我可能在这里遗漏了一些东西,但这使用 pthreads 似乎相当简单。

设置一个小线程池,里面有 N 个线程,并有一个线程来控制它们。

主线程只是位于一个循环中,执行以下操作:

  1. 从数据库中获取数据块
  2. 查找下一个空闲线程 如果没有空闲线程,则等待
  3. 将块移交给工作线程
  4. 返回并从数据库中获取下一个块

与此同时,他们坐下来做的工作线程:

  1. 将自己标记为自由
  2. 等待桅杆线程给我一大块数据
  3. 处理数据块
  4. 再次将自己标记为自由

实现这一点的方法可以像两个互斥控制数组一样简单。一个有工作线程(线程池),另一个指示每个相应线程是空闲还是忙碌。

根据您的喜好调整 N...

于 2008-09-12T00:29:38.860 回答
0

java中使用相同的线程池。但是线程池中的线程是可序列化的并发送到其他计算机并反序列化以运行。

于 2009-03-10T12:00:41.313 回答
0

我开发了一个 MapReduce 库,用于在单个服务器上进行多线程/多核使用。一切都由库处理,用户只需要实现 Map 和 Reduce。它被定位为 Boost 库,但尚未被接受为正式库。查看http://www.craighenderson.co.uk/mapreduce

于 2009-10-28T13:03:20.313 回答
0

您可能有兴趣检查libdispatch的代码,它是 Apple 的 Grand Central Dispatch 的开源实现。

于 2009-10-28T13:09:33.423 回答
0

您也可能对英特尔的 TBB 或 boost::mpi 感兴趣。

于 2009-10-28T13:26:44.020 回答