【发布时间】:2016-02-28 17:34:12
【问题描述】:
我正在尝试制作一个内存效率更高的素数生成器。我想不出比使用文件作为我的素数数组并逐行同步读取更好的方法了。我运行它并且在大约 29000 它给了我ENFILE: File table overflow 错误。有什么想法可以修复/改进此代码?
#!/usr/bin/env node
var num = 3,
prime,
fs = require("fs"),
readline = require("./line_reader.js");
console.log("Hundreds: 2");
console.log("Hundreds: 3");
function appendPrime (num) {
fs.appendFileSync("Primes.txt", num+'\n');
}
while (true) {
prime = true;
var times = Math.floor(Math.pow(num, 0.5));
if (num % 2 == 0 || num % 3 == 0) {
prime = false;
} else {
readline.eachLine("Primes.txt", function (line, last, cb) {
if (num % line == 0) {
prime = false;
cb(true);
} else {
cb();
}
});
}
if (prime) {
var place = String(num).length;
switch (true) {
case place <= 3:
console.log("Hundreds: "+num);
break;
case place <= 5 :
console.log("Thousands: "+num);
break;
case 6 :
console.log("Hundred thousands: "+num);
break;
case place <= 8 :
console.log("Millions: "+num);
break;
case 9 :
console.log("Hundred millions: "+num);
break;
case place >= 10 :
console.log("Billions or above: "+num);
break;
}
appendPrime(num);
}
num += 2;
}
【问题讨论】:
-
readline.eachLine是异步函数,因此您打开的文件太多处于循环中 -
光盘访问速度很慢。埃拉托色尼筛法的良好实施可以更快。