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

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

  •  
  •   Dnlyao Apr 8, 2022 8363 views
    This topic created in 1498 days ago, the information mentioned may be changed or developed.

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

    14 replies    2022-04-11 10:14:53 +08:00
    Dnlyao
        1
    Dnlyao  
    OP
       Apr 8, 2022
    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
        2
    617953997  
       Apr 8, 2022
    流式查询 + 流式写入
    yousabuk
        3
    yousabuk  
       Apr 8, 2022 via iPhone
    查完 1000 条,写文件,再查一下个 1000 条,写文件。

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

    看不懂这个代码,但是小内存下处理就是这么个流程。
    micean
        4
    micean  
       Apr 8, 2022
    #3+1

    每查 1000 条写在 csv 尾部就行了
    paopjian
        5
    paopjian  
       Apr 8, 2022
    内存有限制写入 excel 是不是炸内存了,写成 csv 试一下?
    Dnlyao
        6
    Dnlyao  
    OP
       Apr 8, 2022
    流程是 let row =[] 先查询 1000 条数据 再 push 进 row ,再循环下去。未到写入文件,就爆内存了
    twing37
        7
    twing37  
       Apr 8, 2022
    有没有可能流程是 使用 stream, send -> limit buffer -> rev 呢?
    4771314
        8
    4771314  
       Apr 8, 2022
    分片处理或者使用 stream 的方式向 excel 中追加数据,最后将 Excel 导出,应该可以解决
    Dnlyao
        9
    Dnlyao  
    OP
       Apr 8, 2022
    感谢各位回复,我去尝试一下。
    INCerry
        10
    INCerry  
       Apr 8, 2022
    应该是要复用内存的
    Dnlyao
        11
    Dnlyao  
    OP
       Apr 8, 2022
    @INCerry 能详细说一下怎么处理吗?
    Dnlyao
        12
    Dnlyao  
    OP
       Apr 8, 2022
    用了 .cursor() eachAsync 还是不行,内存控制不住
    snoy
        13
    snoy  
       Apr 9, 2022
    姿势不对,我这个可以
    [email protected]:gogogo1024/mongodbStreamToCSV.git
    Dnlyao
        14
    Dnlyao  
    OP
       Apr 11, 2022
    @snoy 谢谢 我现在看看。
    About     Help     Advertise     Blog     API     FAQ     Solana     5905 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 49ms UTC 02:59 PVG 10:59 LAX 19:59 JFK 22:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86