Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Javascript程序在处理34kb文件时被终止_Javascript_Node.js_Memory - Fatal编程技术网

Node.js Javascript程序在处理34kb文件时被终止

Node.js Javascript程序在处理34kb文件时被终止,javascript,node.js,memory,Javascript,Node.js,Memory,以上代码处理34mb文件 我像你一样运行它 节点des.js 杀死 我在虚拟机512MB内存的Ubuntu服务器上运行 我对javascript还不熟悉,是因为它的算法太差了,还是因为其他原因。我该如何改进它呢?谢谢。您的程序失败了,因为您似乎怀疑它的内存不足。我不能确切地告诉你如何使用fieldMap,但是一个在换行符上拆分32mb文本然后以5个字符拆分每行的快速脚本在我的mac上需要560mb,所以你的虚拟机无法处理它 您必须一次读取一行文件,并在生成时写入输出。fs模块中的异步方法是一个很

以上代码处理34mb文件 我像你一样运行它

节点des.js 杀死

我在虚拟机512MB内存的Ubuntu服务器上运行


我对javascript还不熟悉,是因为它的算法太差了,还是因为其他原因。我该如何改进它呢?谢谢。

您的程序失败了,因为您似乎怀疑它的内存不足。我不能确切地告诉你如何使用
fieldMap
,但是一个在换行符上拆分32mb文本然后以5个字符拆分每行的快速脚本在我的mac上需要560mb,所以你的虚拟机无法处理它

您必须一次读取一行文件,并在生成时写入输出。
fs
模块中的异步方法是一个很好的起点,但我认为您真正想要的可能是。查看
Lazy
上的
lines
方法开始

您可以这样实现它

  var parseFile = function(filename, fieldMap) {
      var array = [];
      var f = fs.readFileSync(filename);

      array = f.toString().split('\n');

      array = array.map(splitLines);
      array = array.map(function(lineArray) {
          var out = [];
          fieldMap.forEach(function(value, key) {
              out.push(lineArray[key]);
          });
          return out;
      });

      return array;
  };

  var splitLines = function(line) {
      return line.split('^');
  };

  (function () {
  for (var k in requiredFieldMap) {
      var v = requiredFieldMap[k];
      fs.writeFileSync(k + '.json', JSON.stringify(parseFile(k + '.txt', v)));
      console.log('done file : ' + k);
  }
  })();

您是否尝试过简化代码以了解失败的原因?没有你的数据,很难判断出哪里出了问题。很明显,它创建了很多不断增长的阵列。哦,我的错误文件实际上是34 mb,我已经将文件分割成了500kb的块。它工作得很好,但它仍然应该被杀死吗?我想这是一个Ubuntu的问题,我如何监控性能并查看限制?fs.appendFile给出错误:EMFILE打开,我想文件描述符太多了。将其移动到连接回调问题已解决。但是显示时间的最终日志显示为“空”,知道为什么吗?哈哈,我没有想到fds太多的问题。不知道为什么时间会打印为空。
var fs = require('fs');

// we use modules lazy and temp, so you have 
// to run "npm install lazy temp" for this script
// to work.
var Lazy = require('lazy');
var tempfile = require('temp');

// Return a function that splits a line around a character
function lineSplitter(char){
  return function(string){
    // use string.toString() so we're ok if string happens to 
    // be a Buffer (lazy generates them, it seems)
    return string.toString().split(char);
  }
}

// Take a file, pass each line to lineHandler, and 
// call done after the entire file has been processed
function parseWholeFile(filename, lineHandler, done){
  var stream = fs.createReadStream(filename);
  Lazy(stream)
    .lines
    .map(lineSplitter('^'))
    .forEach(lineHandler)
    .join(done); 
}

function lineHandler(parts){
  // do something to parts...
  // we'll just append json to a file
  fs.appendFile('/tmp/out.json', JSON.stringify(parts),function(error){
    // ignore it for brevity
  });
}

// This is how you do a main function in node
if(require.main === module){
  // my file lives at /tmp/bigish, but you can pass yours 
  // as a command line argument
  // /tmp/bigish is a 32MB file with lines of around 1kb
  // consisting of 64 byte parts separated by '^' character 
  var filename = process.argv[2] || '/tmp/bigish';
  var started = new Date();

  parseWholeFile(filename, lineHandler, function(){
    var ended = new Date();
    console.log("took " + (ended - started) + "ms");
  });
}