对于冗长的描述道歉。
我希望对大型Mongodb集合中的每个文档进行转换,其中1000万条记录大约为10G。具体来说,我想将geoip转换应用到每个doc中的ip字段,并将结果记录附加到该doc或者只是通过说id来创建链接到这个的整个其他记录(链接不重要,我可以创建一个整个单独记录)。然后我想按城市计算和分组 - (我知道如何做最后一部分)。
我认为我不能使用map-reduce的主要原因是我不能在map函数中调用geoip库(或者至少这是我认为存在的约束)。
所以我的核心问题是如何运行集合中的每条记录应用转换 - 使用最有效的方法来执行此操作。
通过限制/跳过批处理是不可能的,因为它进行“表扫描”并且它将逐渐变慢。
有什么建议吗?
Python或Js首选,因为我有这些geoip库,但欢迎使用其他语言的代码示例。
答案 0 :(得分:1)
由于你必须检查“每条记录”,你无论如何都会进行一次全表扫描,然后一个简单的光标(find()
)+可能只取几个字段(_id,ip)应该这样做。 python驱动程序将在引擎盖下进行批处理,所以如果默认值不够好,也许你可以给出最佳批量大小(batch_size
)的提示。
如果添加新字段并且它不适合以前分配的空间,则mongo必须将其移动到其他位置,因此您最好创建新文档。
答案 1 :(得分:0)
实际上我也在尝试另一种并行方法(如计划B),即使用mongoexport。我使用它与--csv转储一个只有(id,ip)字段的大型csv文件。然后计划是使用python脚本进行geoip查找,然后回发到mongo作为新的doc,现在可以运行map-reduce进行计数等。不确定这是否更快或光标是否。走着瞧。