以下代码将文件中的一些信息导出到MongoDb。
categories.forEach(function(category){
var path = dirpath + '/' + directory + '/category_' + category.id + '.csv';
var readStream = fs.createReadStream(path);
var readLine = readline.createInterface({
input: readStream
});
var items = [];
(function(items,readLine){
readLine.on('line', function (line) {
items.push(mapItems(line.split(';')));
if(items.length > 10000) {
saveItems(items); //save chunk
items.length = 0; //clear an array
}
});
readLine.on('close', function () {
saveItems(items);
items.length = 0;
});
})(items,readLine)
});
saveItems功能代码:
function saveItems(items){
schema.items.collection.insert(items, function (err) {
if(err)
console.log(err);
})
}
对于大文件(大约300mbs),此代码与process out of memory
崩溃,尽管已清除items
数组。谁能解释我为什么?
答案 0 :(得分:1)
很难说。您可以尝试每几千行拍摄一次内存快照,并了解内存增长的原因,更多信息请点击此处:http://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/
您很可能无法将所有数据存储在内存中(您正在读取的大文件)。最有可能的是你必须以更易于管理的块(即一次1000行)分解它,然后插入那些较小的块并释放使用的内存。不幸的是,我不确定如何在MangoDB中做到这一点,所以你必须弄明白。