【问题标题】:Insert large amount of entries into Mongodb with Nodejs使用 Nodejs 向 Mongodb 中插入大量条目
【发布时间】:2013-04-15 16:15:12
【问题描述】:

所以我有一个包含“引脚”的文件,我需要将其输入到 mongodb。它们包含在一个名为 pins.txt 的文件中,数据以换行符分隔:

A4DS24SD2
DF234SDF2
HFFGHFG45
JDRSDFG35
...

我需要导入大约 70,000 个图钉。

每个 pin 还有一个默认的used 状态false

所以,为了导入如此大量的引脚,我使用 nodejs/mongoose(我的应用程序内置)来完成这个

  fs.readFile './data/pins-test.txt', 'utf8', (err,data)->
    if err
      console.log err
    codes = data.split('\n')
    codes.forEach (code)->
      pin = new Pin()
      pin.pinid = code
      pin.save()

在测试几百个引脚时效果很好,但是当我尝试 70,000 个文件并给出错误时,我的机器内存不足:

FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory

那么,我的问题是,导入这么多数据的最佳方法是什么?我应该一次使用 async.js 来做这些吗?

【问题讨论】:

    标签: node.js mongodb express mongoose database


    【解决方案1】:

    fs.readFile 的问题是在触发回调之前加载了整个文件。

    您可以使用BufferedReader 逐行执行此操作

    这样的东西应该可以工作(注意...未经测试!)

    reader = require "buffered-reader"
    DataReader = reader.DataReader
    

    ...

      new DataReader("./data/pins1.txt", { encoding: "utf8" })
        .on "error", (error)->
            console.log ("error: " + error);
        .on "line", (line)->
            console.log(i,line)
            i++
            pin = new Pin()
            pin.pinid = line
            pin.save()
        .on "end", ()->
            console.log ("EOF")
        .read()
    

    【讨论】:

    • 哇,原来我的文件是 700,000 行,而不是 70,000 行。不用说,这个模块很好用。只需几分钟即可导入所有内容。我已经为我的工作代码更新了您的代码示例。
    • 我想说 70k 行听起来不够长,无法填满你的 RAM!很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2017-11-29
    相关资源
    最近更新 更多