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