gpt4 book ai didi

node.js - 插入许多文档后关闭 node.js 中的 mongodb 连接

转载 作者:可可西里 更新时间:2023-11-01 09:12:26 25 4
gpt4 key购买 nike

有人问过这个问题,但 OP 接受的答案没有满足我的特殊需求。

closing mongodb connection in node.js while inserting lot of data

我有一个实用程序脚本,可以将大量记录添加到多个集合中。实际上,它只是一个使用 byline 读取非常大的文本文件然后将数据插入集合的导入:

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,从而关闭数据库。

最佳答案

当所有行都被读取时,你应该设置一个标志:

var readAllLines = false;

byLineStream.on("end", function() {
readAllLines = true;
});

接下来,您在插入每条记录后检查该标志。但是,您还需要跟踪已读取的行数以及插入的行数,因此只有在所有行都已插入(甚至乱序)时才关闭数据库。

将所有内容放在一起:

db.dropCollection("Data", function(err, result) {
var lineCount = 0;
var readAllLines = false;

byLineStream.on("end", function() {
readAllLines = true;
});

byLineStream.on("data", function(line) {
lineCount++;
var o = parseLineToObject(line);
collection.insert(o, { w : 1 }, function() {
if (--lineCount === 0 && readAllLines) {
// we've read and inserted all lines
db.close();
}
});
});
});

但是,我确实相信将回调传递给 insert(“安全模式”)比您当前的解决方案慢,在该解决方案中您调用 insert 但不要等待等待它的结果。为了加快速度,您可以先缓冲 X 行,然后再将它们插入到一个语句中,而不是单独编写每一行。

类似的东西(没有行数):

var buffer = [];
byLineStream.on("data", function(line) {
buffer.push(parseLineToObject(line));
if (buffer.length > 100 || readAllLines) {
collection.insert(buffer, { w : 1 }, function() {
if (readAllLines) {
db.close();
}
});
buffer = [];
}
});

关于node.js - 插入许多文档后关闭 node.js 中的 mongodb 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20865615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com