【发布时间】:2014-01-02 01:42:30
【问题描述】:
有人问过这个问题,但 OP 接受的答案没有满足我的特殊需求。
closing mongodb connection in node.js while inserting lot of data
我有一个实用程序脚本,可以将大量记录添加到多个集合中。实际上,它只是一个使用 byline 读取 VERY LARGE 文本文件然后将数据插入到集合中的导入:
var MongoClient = require("mongodb").MongoClient;
var fs = require("fs");
var byline = require("byline");
var inStream = fs.createReadStream("data.txt", { encoding: "utf8" });
var byLineStream = byline.createStream(inStream);
MongoClient.connect("mongodb://localhost:27017/test", { native_parser: true}, function(err, db) {
var collection = db.collection("Data");
db.dropCollection("Data", function(err, result) {
byLineStream.on("data", function(line) {
var o = parseLineToObject(line);
collection.insert(o);
});
});
});
建议的答案是将所有数据推送到一个数组中,然后在完成后使用单次写入和回调来关闭数据库。这不是一个好的答案,因为我正在处理的文件非常大,因此会消耗大量内存。
另一个类似question 的解决方案是使用async 包创建一个函数数组,然后并行运行它们。另一个半身像,但至少它不会创建一个巨大的单个插入。
所以问题是:如何在所有插入完成后关闭 MongoDB 连接,以便我的脚本退出并且不会挂起?
我应该补充一点,我已经尝试过在插入回调中增加计数器变量的计数方法。它不起作用,因为在插入的某个时刻,回调执行和完成的速度比插入完成的速度快,导致计数器在插入仍在进行时达到 0,从而关闭数据库。
【问题讨论】: