因此标题很简单。我有一个大约500mb的文件,所有标签分隔的值。我实现了一个解析器,它遍历每一行并以对象的形式将其推送到数组。在迭代完所有行之后,我使用mongo的insertmany来存储所有值。我在一个包含100行数据的文件上对此进行了测试,效果很好。但是我不确定这对于500mb的数据是如何工作的...我读到插入的那种当mongo监督插入并且每个插入推送1000个项目时会做这件事,但是nodejs呢?它可以处理这么多数据,也推动阵列只是听起来各种各样的错误。我该如何处理?
答案 0 :(得分:0)
您需要使用流阅读器来执行此操作。否则,您将整个文件加载到内存中,创建大量数据,同时尝试使mongo处理数万条记录。很可能服务器会爆炸。只是流动它。这样你就可以在" chunks"中解析文件,并且一次只能插入几千个文件。
这是一篇关于Node.js流的好文章: https://medium.freecodecamp.org/node-js-streams-everything-you-need-to-know-c9141306be93
基本上,对于"每个"数据块,你在该块中创建一个新的项目数组,然后mongo将这些项目激发到数据库中。继续这样做,直到文件被完全读取。这将消耗很少的内存占用,并且您会对它的工作速度感到惊讶。
这是一个未经测试的例子:
const fs = require('fs');
const readable = fs.createReadStream('path to file');
readable.on('data', (chunk) => {
// will be read as "bytes" in the file, and be accessible in a buffer
console.log(`Received ${chunk.length} bytes of data.`);
// so you will need to do something to convert it to human readable stuff... possibly just a tostring()?
const data = chunk.toString();
// do something from your data. Tranform it into the json you need
let jsonChunk = doSomethingTogetYourJsonDataFromData();
mongo.insertMany(jsonChunk);
});
readable.on('end', () => {
console.log('End of file');
});
上面的语法不准确,甚至没有显示正确的依赖关系,所以把它看作伪代码,但希望它足以让你指向正确的方向。