我开始解决一些代码测试问题,即使问题的速度得分一般很好,内存也很低。
你能帮帮我吗?为什么这段代码使用了这么多内存(6392809 MEMORY,BYTES)?var fs = require("fs");
fs.readFileSync(process.argv[2]).toString().split('\n').forEach(function (line) {
if (line != "") {
console.log( line.split(' ').map(function(item){
return item.substr(-1) + item.substr(1, item.length-2) + item[0];
}).join(' '));
}
});
SWAP NUMBERS 挑战描述:
编写一个程序,给定一个句子,其中每个单词都有一个单位正整数作为前缀和后缀,交换数字,同时保留其间的单词。句子中的单词用空格分隔。
INPUT SAMPLE:
第一个参数是文件的路径。输入文件的每一行包含一个由句子表示的测试用例。句子中的每个单词以单个数字正整数开始和结束,即0到9.假设所有字符都是ASCII。
4Always0 5look8 4on9 7the2 4bright8 9side7 3of8 5life5
5Nobody5 7expects3 5the4 6Spanish4 9inquisition0
输出样本:
对于每个测试用例,打印到标准输出通过交换每个单词周围的数字获得的句子,每行一个。
0Always4 8look5 9on4 2the7 8bright4 7side9 8of3 5life5
5Nobody5 3expects7 4the5 4Spanish6 0inquisition9
约束:
每个单词的后缀和前缀可以相等。 句子长度为1到17个单词。 测试用例数为40。
我想尝试提高记忆分数,欢迎任何提示。
答案 0 :(得分:5)
我认为这会立即在整个文件中读取:fs.readFileSync(process.argv[2]).toString()
因此至少会占用RAM中文件的大小。
答案 1 :(得分:3)
我敢打赌你的问题是你把整个文件加载到内存中。其他建议您以某种形式逐行阅读,但这可能没有帮助。测试人员只需1行即可输入巨大的文件,但最终仍会占用大量内存。您最好的方法是以块的形式读取文件。使用fs.readSync
(这里不需要异步内容)。你应该处理单词,这样你就应该阅读chunk,交换单词中的单词并继续。当然,他们可能会在文件中放入一个巨大的单词,但这是一个复杂的下一层次。
答案 2 :(得分:2)
我建议使用正则表达式而不是所有代码。
如果你有一个小的或巨大的文件,那没关系。
只需删除所有代码并使用:
.replace(/(\d)([^\d]+)(\d)/g,'$3$2$1');
示例:
alert("4Always0 5look8 4on9 7the2 4bright8 9side7 3of8 5life5\n\
5Nobody5 7expects3 5the4 6Spanish4 9inquisition0".replace(/(\d)([^\d]+)(\d)/g,'$3$2$1'));

那很简单!
您的最终代码:
var fs = require("fs");
var text = fs
.readFileSync(process.argv[2])
.toString() //is this really needed?
.replace(/(\d)([^\d]+)(\d)/g,'$3$2$1');
这将减少内存使用量,因为您只需触摸字符串。请注意,这可能会将整个文件加载到内存中,这可能仍会显示高使用率。