NodeJS - 将json数组作为多个json文件输出到磁盘

时间:2017-07-20 03:58:44

标签: javascript node.js file

我尝试使用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);
              }
            }
            });
        }
    });
}

2 个答案:

答案 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');
        }
    });
}