如何使用mongoose对一个100万+的mongodb的表进行遍历操作
发布于 12 年前 作者 askie 42858 次预览 最后一次回复是 6 年前 来自
这个问题困扰我很久了,一致没有想明白。 这个表有100万的document,我需要遍历他,每次拿出来10条文档,对其进行1个比较耗时的处理,会利用callback返回,进行下10条文档的处理。 直接使用如下代码,把所有100万数据都放入内存,然后利用async处理,我知道比较蠢,测试了一下,内存猛涨
Blockquote MyModel.find({}, function (err, docs) { dosomething(docs,callback)}); Blockquote
这里请教一下大侠们,可否指点一下方法,使得可以遍历完成100万数据的处理,并且不会引起内存骤增,谢谢了!
16 回复
加个定时器试试,个人理解,高手勿喷
定时器是无法搞定的!
100W应该有索引吧例如_id,那每次读10条,callback自己再继续下个10条?
callback 会导致堆栈溢出 有个类似的问题:http://stackoverflow.com/questions/10546193/how-to-return-large-amount-of-rows-from-mongodb-using-node-js-http-server
答案4不明白如何实现的
如果每次读取10条,需要等待这10条处理完毕callback返回后,再去拿下10条去处理。这么考虑是为了不让处理数据的服务负载太大。
如果每次拿10条记录,不等待处理服务处理完毕,就又去领10条记录处理,会让处理数据的服务压力太大!
因此,想采取单线一次只处理10条记录,处理完毕再处理下10条,直至所有100万记录处理完毕。
是不是mongodb输出数据时,是不等待的,无法组塞住?
I guess it means
tested with 967615 records, memory usage: 18M --> 110M --> 25M
一次性取100万个太大了,那能不能一次取10个呢?使用分页
刚才的没有做过测试,我那自己的项目写了一个完整案例,你看一下对你有没有帮助
当然这个是没有经过优化的,如果要优化就要解决变量顺序、默认值等问题,尽量让api简介好用,希望对你有帮助!
@shiedman 跪拜了!
skip方式对大数据有问题,不能使用。这个之前遇到过,后来我们采取的是数字索引排序的方式,index大于起始值,取出来100个,把100个中最大的index记录下来下次查询使用。
这样可以保证拿出的数据是少量的,而且减少了skip引起的速度慢的问题。
如果使用skip方式,在shard环境下,如果跨shard获取数据的话,会引起负载爆升!
相当清晰,非常感谢! 如果要使用在大数据下,不能取过大的数据,否则会引起跨shard扫描的问题。
一般单机环境小数据都是非常棒的方案!
感谢大神!
关注这个问题。 MARK一个
学习了
使用Query.prototype.cursor()
参考:query_Query-cursor
阔以参考这篇博客:如何高效地遍历 MongoDB 超大集合?