Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在nodeJS中缓冲流中的数据以执行大容量插入_Javascript_Node.js_Mongodb_Stream_Buffer - Fatal编程技术网

Javascript 在nodeJS中缓冲流中的数据以执行大容量插入

Javascript 在nodeJS中缓冲流中的数据以执行大容量插入,javascript,node.js,mongodb,stream,buffer,Javascript,Node.js,Mongodb,Stream,Buffer,如何在nodeJS中有效地缓冲从流到大容量插入的事件,而不是从流接收的每个记录的唯一插入。下面是我想到的伪代码: // Open MongoDB connection mystream.on('data', (record) => { // bufferize data into an array // if the buffer is full (1000 records) // bulk insert into MongoDB and empty buffer })

如何在nodeJS中有效地缓冲从流到大容量插入的事件,而不是从流接收的每个记录的唯一插入。下面是我想到的伪代码:

// Open MongoDB connection

mystream.on('data', (record) => {
   // bufferize data into an array
   // if the buffer is full (1000 records)
   // bulk insert into MongoDB and empty buffer
})

mystream.on('end', () => {
   // close connection
})

这看起来真实吗?
是否有任何可能的优化?使用NodeJS的

流库的现有库设施,可以简洁高效地实现为:

const stream=require('stream');
const util=require('util');
const mongo=require('mongo');
常量streamSource;//从某处来的一股物体流
//建立数据库连接
const client=new mongo.MongoClient(“uri”);
等待client.connect();
//用于存储文档的特定集合
const collection=client.db(“my_db”).collection(“my_collection”);
wait util.promisify(stream.pipeline)(
streamSource,
流。可写({
objectMode:true,
高水位:1000,
writev:async(块,下一个)=>{
试一试{
const documents=chunks.map(({chunk})=>chunk);
wait collection.insertMany(docs,{ordered:false});
next();
}
捕获(错误){
下一步(错误);
}
}
})
);

我最终得到了一个无依赖性的解决方案

const{MongoClient}=require(“mongodb”)
const url=process.env.MONGO_URI | |”mongodb://localhost:27019";
const connection=MongoClient.connect(url,{useNewUrlParser:true,useUnifiedTopology:true})
承诺。解决(连接)
。然后((db)=>{
const dbName=“databaseName”;
const collection='collection';
constdbo=db.db(dbName);
让缓冲区=[]
stream.on(“数据”,(行:任意)=>{
buffer.push(行)
如果(缓冲区长度>10000){
collection(collection).insertMany(缓冲区,{ordered:false});
缓冲区=[]
}
});
stream.on(“结束”,()=>{
//插入最后一块
collection(collection).insertMany(缓冲区,{ordered:false})
.然后(()=>{
console.log(“完成!”);
db.close();
})
});
sas_stream.on(“error”,(err)=>console.log(err));
})
.catch((错误)=>{
console.log(错误)
})

nodejs native
stream
api听起来非常适合,您应该考虑使用可写的。缓冲区的大小可以通过设置highWaterMark来控制。可写类有一个
final()
函数,该函数在流完成后调用。这可以用来关闭db连接。谢谢你的回答,我也考虑过这个选项,这可能是解决这个问题的最好方法,你得到的数据越多,放在缓冲区的数据越多,你在缓冲区中收到的数据将自动填充MongoDB数据库,我假设通过这种方式,您还可以控制数据流,并自动销毁输入中的数据。我计划通过这种方法使用从小到相当大的数据集(从几kb到5-10gb的流数据),MongoDB的本机驱动程序(和Mongoose API)都公开了一个DB游标接口,可以封装为stream.Readable(
stream.Readable.from()
)然后通过管道传输到可写缓冲区。因此,脚本获取的数据不会超过其可写缓冲区中存储的数据量。此示例非常接近我再次寻找的内容,非常感谢您的帮助,它可能是解决我问题的一个临时解决方案。