我有一个文件,它以JSON形式存储了许多JavaScript对象,我需要读取文件,创建每个对象,并对它们进行操作(在我的情况下将它们插入到数据库中) 。的JavaScript对象可被表示的格式:解析Nodejs中的大型JSON文件
格式答:
[{name: 'thing1'},
....
{name: 'thing999999999'}]
或格式B:
{name: 'thing1'} // <== My choice.
...
{name: 'thing999999999'}
注意,...
指示很多JSON对象。我知道我可以将整个文件读入内存,然后使用JSON.parse()
这样的:
fs.readFile(filePath, 'utf-8', function (err, fileContents) {
if (err) throw err;
console.log(JSON.parse(fileContents));
});
但是,该文件可能是非常大的,我宁愿使用流来做到这一点。我在流中看到的问题是,文件内容可能会在任何时候分解为数据块,因此如何在这些对象上使用JSON.parse()
?
理想情况下,每个对象将被读作一个单独的数据块,但我不确定如何做到这一点。
var importStream = fs.createReadStream(filePath, {flags: 'r', encoding: 'utf-8'});
importStream.on('data', function(chunk) {
var pleaseBeAJSObject = JSON.parse(chunk);
// insert pleaseBeAJSObject in a database
});
importStream.on('end', function(item) {
console.log("Woot, imported objects into the database!");
});*/
注意,我希望阻止将整个文件读入内存。时间效率对我无关紧要。是的,我可以尝试一次读取多个对象并一次插入所有对象,但这是一种性能调整 - 我需要一种确保不会导致内存过载的方式,无论文件中包含多少个对象。
我可以选择使用FormatA
或FormatB
或其他什么东西,请在您的答案中指定。谢谢!
对于格式B,您可以通过块解析新行,并提取每个整行,如果在中间切断,则连接其余行。 虽然可能有更优雅的方式。我没有用过很多流。 – travis 2012-08-08 22:39:41