请问一下,查询万条数据,内存不断增长的解决方法。

2022-04-08 10:22:59 +08:00
 Dnlyao

node+mongoose ,利用 pm2 管理项目,内存限制 512MB 。业务是查询记录,然后导出 excel 。目前是手动将万条数据 id ,1000 条一组跑循环查询,放入数组,最后拿数组生成文件。但每次都内存超出,项目重启了。

7302 次点击
所在节点    Node.js
14 条回复
Dnlyao
2022-04-08 10:25:44 +08:00
let ids = []
let total = await TradeRecord.find(conditions).select('id').sort({'tradeAt': -1})
for (let item of total) {
ids.push(item._id)
}
for (let index = 1; index <= Math.floor(ids.length / 10) + 1; index++) {
let tradids = []
let i = index - 1 > 0 ? (index - 1) * 10 : 0
if ((index * 10) < ids.length) {
tradids = ids.slice(i, index * 10)
} else {
tradids = ids.slice(i)
}
if (tradids.length > 0) {

let ret = await TradeRecord.find({_id: {$in: tradids}})
.select('device organization restaurant user deploySite consumeInterval amount mainAccountAmount subsidyAmount giveFreeAmount balance subsidyBalance giveFreeBalance tradeAt sn deviceSerial subAccount supermarketConsume payMethod consumeType consumePayMethod deviceMode ')
.populate('organization', 'name')
.populate('restaurant', 'name')
.populate('deploySite', 'name')
.populate({
path: 'user',
select: 'department name type jobNumber cardUid fingerprint',
populate: {path: 'department', select: 'name'}
})

rowsbase.push(...ret)
}
}
}

代码如上
617953997
2022-04-08 10:28:50 +08:00
流式查询 + 流式写入
yousabuk
2022-04-08 10:52:46 +08:00
查完 1000 条,写文件,再查一下个 1000 条,写文件。

再不行就每次 100 条,50 条……

看不懂这个代码,但是小内存下处理就是这么个流程。
micean
2022-04-08 11:01:28 +08:00
#3+1

每查 1000 条写在 csv 尾部就行了
paopjian
2022-04-08 11:04:19 +08:00
内存有限制写入 excel 是不是炸内存了,写成 csv 试一下?
Dnlyao
2022-04-08 11:11:08 +08:00
流程是 let row =[] 先查询 1000 条数据 再 push 进 row ,再循环下去。未到写入文件,就爆内存了
twing37
2022-04-08 11:27:56 +08:00
有没有可能流程是 使用 stream, send -> limit buffer -> rev 呢?
4771314
2022-04-08 11:30:38 +08:00
分片处理或者使用 stream 的方式向 excel 中追加数据,最后将 Excel 导出,应该可以解决
Dnlyao
2022-04-08 11:48:05 +08:00
感谢各位回复,我去尝试一下。
INCerry
2022-04-08 17:03:08 +08:00
应该是要复用内存的
Dnlyao
2022-04-08 17:14:45 +08:00
@INCerry 能详细说一下怎么处理吗?
Dnlyao
2022-04-08 17:26:47 +08:00
用了 .cursor() eachAsync 还是不行,内存控制不住
snoy
2022-04-09 16:50:34 +08:00
姿势不对,我这个可以
git@github.com:gogogo1024/mongodbStreamToCSV.git
Dnlyao
2022-04-11 10:14:53 +08:00
@snoy 谢谢 我现在看看。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845635

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX