我有一個文件,它以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