我尝试使用NodeJS从JSON文件中读取JSON数组,然后将每个JSON对象输出多个JSON文件到磁盘。
然而,我得到了错误EMFILE:太多打开的文件
该数组有20,000个对象。
代码:
function main(){
var clusters_statistics=require("cluster_whole_1.json");
for(var i=0; i<clusters_statistics.length; i++){
var fs=require('fs');
var outputFilename='cut_json/'+i+'.json';
fs.writeFile(outputFilename, JSON.stringify(clusters_statistics[i], null, 4), function(err) {
if(err) {
console.log(err);
} else {
console.log(data);
}
});
}
}
更新: 1.我试图使用Gustavo建议的close()函数,不幸的是,它仍然说“文件太多了”。 (这次“打开”)。 然后我尝试在close()内部递归,现在它可以工作了。
代码:
function main(){
clusters_statistics=require("cluster_whole_1.json");
call_close(clusters_statistics.length);
}
function call_close(i){
var fs = require("fs");
var path = 'cut_json/'+i+'.json';
fs.open(path, "w+", function(error, fd) {
if (error) {
console.error("open error: " + error.message);
}else {
fs.writeFile(path, JSON.stringify(clusters_statistics[i], null, 4), function(err) {
if(err) {
console.log(err);
} else {
}
});
fs.close(fd, function(error) {
if (error) {
console.log(err);
} else {
if(i<=0){
return;
}else{
if(i%100==0){
console.log(i);
}
call_close(i-1);
}
}
});
}
});
}
答案 0 :(得分:0)
将Jason写入其中后关闭文件。
现在您要保持文件打开并填充内存,如果您不手动关闭它们,它们将仅在您的程序完成时关闭。
var fs=require('fs'); function main(){ var clusters_statistics=require("cluster_whole_1.json"); for(var i=0; i<clusters_statistics.length; i++){ var outputFilename='cut_json/'+i+'.json'; var my_file = fs.open(outputFilename, 'w+'); var buffer = new Buffer(JSON.stringify(clusters_statistics[i], null,4): fs.write(my_file, buffer, 0, buffer.length, null, function(err, written, buffer) { if(err) { console.log(err); } else { console.log('OK!'); } }); fs.close(my_file); }
答案 1 :(得分:0)
使用fs.writeFile
时无需打开和关闭文件描述符,但您可能希望按顺序编写文件,这样就不会一次打开太多文件。
function write_cluster_statistics(clusters_statistics, callback, index) {
index = index || 0;
if (index >= clusters_statistics.length) {
return callback();
}
var fs = require('fs');
var path = 'cut_json/' + index + '.json';
var content = JSON.stringify(clusters_statistics[index], null, 4);
fs.writeFile(path, content, function (err) {
if (err) {
callback(err);
} else {
write_cluster_statistics(clusters_statistics, callback, index + 1);
}
});
}
function main() {
var clusters_statistics = require("cluster_whole_1.json")
write_cluster_statistics(clusters_statistics, function (err) {
if (err) {
console.error(err);
} else {
console.log('done');
}
});
}