我目前正在进行一个项目,该项目涉及在许多相对较小的数据集上执行大量统计计算。其中一些计算就像计算移动平均线一样简单,而另一些则涉及稍微更多的工作,比如斯皮尔曼的Rho或肯德尔的Tau计算。
数据集本质上是一系列封装在字典中的数组,其键与MongoDb中的文档id相关,该文档id提供了有关子集的进一步信息。字典中的每个数组的值不超过100。然而,这些字典可能是无限大的。然而,事实上,每年大约有150个值被添加到字典中。
我可以使用mapreduce来执行所有必要的计算。或者,我可以在分布式系统上使用Celery和RabbitMQ,并在python中执行相同的计算。
我的问题是:哪种途径是最值得推荐的还是最佳实践?
以下是一些附加信息:
- 我还没有对任何东西进行基准测试,因为我刚刚开始构建脚本以计算每个数据集的度量
- 使用celener/rabitmq-分布式队列可能会增加针对Mongo数据库的查询数量
- 我不认为这两种方法的内存使用都是一个问题,除非同时执行的任务数量很大。大多数任务本身只是在数据集中获取一个项目,加载它,进行计算,然后释放它。因此,即使数据集中的数据量很大,也不是所有数据都会一次加载到内存中。因此,在我看来,限制因素归结为mapreduce或排队系统执行计算的速度。此外,它还取决于并发任务的数量
谢谢你的帮助!
如果没有基准测试是不可能的,但我的直觉倾向于用Python而不是mapreduce进行更多的计算。我主要担心的是mapreduce是单线程的:一个MongoDB进程一次只能运行一个Javascript函数。然而,它可以同时为数千个查询提供服务,因此您可以通过从多个Python进程查询MongoDB来利用这种并发性。