1

我目前正在从事一个项目,该项目涉及对许多相对较小的数据集执行大量统计计算。其中一些计算就像计算移动平均线一样简单,而另一些则涉及更多的工作,例如 Spearman 的 Rho 或 Kendell 的 Tau 计算。

数据集本质上是打包到字典中的一系列数组,其键与 MongoDb 中的文档 id 相关,该文档 id 提供有关子集的更多信息。字典中的每个数组的值不超过 100 个。然而,字典可能无限大。然而,实际上,每年约有 150 个值被添加到字典中。

我可以使用 mapreduce 来执行所有必要的计算。或者,我可以在分布式系统上使用 Celery 和 RabbitMQ,并在 python 中执行相同的计算。

我的问题是:最推荐或最佳实践的途径是什么?

以下是一些附加信息:

  1. 我还没有对任何东西进行基准测试,因为我刚刚开始构建脚本以计算每个数据集的指标。
  2. 使用 celery/rabbitmq 分布式队列可能会增加对 Mongo 数据库的查询数量。
  3. 我不认为这两种方法的内存使用是一个问题,除非同时执行的任务数量非常大。大多数任务本身只是在数据集中获取一个项目,加载它,进行计算,然后释放它。所以即使一个数据集中的数据量非常大,也不会一次全部加载到内存中。因此,在我看来,限制因素归结为 mapreduce 或排队系统执行计算的速度。此外,它取决于并发任务的数量。

谢谢你的帮助!

4

1 回答 1

0

如果没有基准测试就不可能说,但我的直觉倾向于在 Python 中而不是 mapreduce 中进行更多计算。我主要担心的是 mapreduce 是单线程的:一个 MongoDB 进程一次只能运行一个 Javascript 函数。但是,它可以同时处理数千个查询,因此您可以通过从多个 Python 进程查询 MongoDB 来利用这种并发性。

于 2012-08-22T18:51:33.447 回答