Tôi có một tệp lưu trữ nhiều đối tượng JavaScript ở dạng JSON và tôi cần đọc tệp, tạo từng đối tượng và làm gì đó với chúng (chèn chúng vào db trong trường hợp của tôi). Các đối tượng JavaScript có thể được biểu diễn theo định dạng:
Định dạng A:
[{name: 'thing1'},
....
{name: 'thing999999999'}]
hoặc Định dạng B:
{name: 'thing1'} // <== My choice.
...
{name: 'thing999999999'}
Lưu ý rằng ...
dấu chỉ ra rất nhiều đối tượng JSON. Tôi biết rằng tôi có thể đọc toàn bộ tệp vào bộ nhớ và sau đó sử dụng JSON.parse()
như sau:
fs.readFile(filePath, 'utf-8', function (err, fileContents) {
if (err) throw err;
console.log(JSON.parse(fileContents));
});
Tuy nhiên, tệp có thể thực sự lớn, tôi muốn sử dụng luồng để thực hiện điều này. Vấn đề tôi gặp phải với luồng là nội dung tệp có thể bị chia thành các phần dữ liệu tại bất kỳ thời điểm nào, vậy làm cách nào để sử dụng JSON.parse()
trên các đối tượng như vậy?
Lý tưởng nhất là mỗi đối tượng sẽ được đọc như một đoạn dữ liệu riêng biệt, nhưng tôi không chắc về cách thực hiện điều đó .
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!");
});*/
Lưu ý, tôi muốn ngăn việc đọc toàn bộ tệp vào bộ nhớ. Hiệu quả về thời gian đối với tôi không thành vấn đề. Có, tôi có thể cố gắng đọc một số đối tượng cùng một lúc và chèn tất cả chúng cùng một lúc, nhưng đó là một tinh chỉnh về hiệu suất - tôi cần một cách được đảm bảo không gây quá tải bộ nhớ, bất kể có bao nhiêu đối tượng trong tệp .
Tôi có thể chọn sử dụng FormatA
hoặc FormatB
hoặc có thể cái gì khác, chỉ cần bạn ghi rõ trong câu trả lời. Cảm ơn!