我正在评估MongoDB。我有一个20GB的小文档子集。每个基本上都是社交游戏的请求日志,以及当时用户正在玩的游戏的一些捕获状态。
我以为我会尝试寻找游戏骗子。所以我写了一个运行服务器端的函数。它在索引集合上调用find()并根据现有索引进行排序。使用游标,它按索引顺序浏览所有文档。索引是{user_id,time}。因此,我将浏览每个用户的历史记录,检查某些值(金钱/健康/等)是否比游戏中增加的速度快。该脚本返回找到的第一个违规。它不收集违规行为。
此脚本在客户端上执行的唯一操作是定义函数并在另一个框上的mongod实例上调用mymongodb.eval(myscript)
。
mongod正在运行的框很好。脚本启动的那个开始丢失内存和交换。几小时后:在客户端计算机上使用了8GB的RAM和6GB的交换,只需在另一个盒子上启动脚本并等待返回值。
mongo客户端真的很棒吗?我做错了什么或对mongo / mongod做了错误的假设吗?
答案 0 :(得分:0)
如果您只想打开与远程数据库的客户端连接,则应使用mongo
命令,而不是mongod
。 mongod
在本地计算机上启动服务器。不确定指定网址的内容。
尝试
mongo remotehost:27017
答案 1 :(得分:0)
对长时间运行的作业使用map / reduce而不是db.eval()。 db.eval阻止其他操作!
eval
是一个阻止整个服务器的函数,如果你不使用特殊标志。再次,来自文档:
如果你不使用“nolock”标志,db.eval()会在运行[...]时阻止整个mongod进程
你在这里滥用MongoDB。您当前的例程很奇怪,因为它会返回找到的第一个违规,但是下次运行时必须重新检查所有内容(除非您订购了用户ID并存储了上次评估的用户ID)。
Map / Reduce通常是长期运行任务的更好选择,但聚合数据似乎并不重要。但是,基于地图/减少的解决方案也可以解决重新评估问题。
我可能会从map / reduce:
返回这样的内容user id -> suspicious actions, e.g.
------
2525454 -> [{logId: 235345435, t: ISODate("...")}]