0

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

A4DS24SD2
DF234SDF2
HFFGHFG45
JDRSDFG35
...

我需要导入大约 70,000 个引脚。

每个引脚还具有默认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 来做这些吗?

4

1 回答 1

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()
于 2013-04-15T16:36:05.040 回答