我正在尝试制作一个素数筛子,它对我来说效果很好。但是,它不会将数据写入文件。它说素数被倾倒到一个文件中。 fs.writeFile有一些大小限制吗?素数数组可以变得非常大。有人可以帮我这个吗?
代码:
#!/usr/bin/env node
var primes = ["2", "3"];
var num = 3;
var prime;
var fs = require("fs");
console.log("Hundreds: 2");
console.log("Hundreds: 3");
while (true) {
prime = true;
var times = Math.pow(num, 0.5);
for (var i=0;i<times;i++) {
if (num % parseInt(primes[i], 32) == 0) {
prime = false;
break;
}
}
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;
}
primes.push(num.toString(32));
prime = false;
}
if ((num - 1) % 5000000 == 0) {
fs.writeFile("Primes.txt", JSON.stringify(primes, null, '\t'), function (err) {
if (err) {
console.log("Primes couldn't be dumped");
throw err;
}
console.log("Primes dumped");
});
}
num += 2;
}
答案 0 :(得分:4)
通过运行你的代码,我得出的结论是,不知何故,素数计算会扰乱文件写入。所以我尝试使用fs.writeFileSync(...)
并且它有效。与达到5000000阈值所需的时间相比,该文件实际写得非常快(从长远来看,它可能会开始花费大量时间,因为在文件写入之间生成了超过300000个新素数并且你写了所有的以前的素数也是如此)。我真的不知道异步方法为什么不编写它。计算素数可能太忙了。你知道,nodejs异步调用不是并行的。
尝试这样的事情
...
if ((num - 1) % 5000000 == 0) {
fs.writeFileSync("Primes.txt", JSON.stringify(primes, null, '\t'))
console.log("Primes dumped");
}
...
指向api的链接位于:https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback
请注意,每次都会重写Primes.txt。考虑使用fs.appendFileSync(...)
。这将解决在代码运行一段时间后编写文件所花费的时间太长的问题。
我参与了'.appendFileSync()'。为此,我不得不模仿数组类型的'JSON.stringify()'输出。到目前为止,这是我的代码:
var primes = ["2", "3"];
var num = 3;
var prime;
var fs = require("fs");
latestPrimes = "[\n\t2,\n\t3"
while (true) {
prime = true;
var times = Math.pow(num, 0.5);
for (var i=0;i<times;i++) {
if (num % parseInt(primes[i], 32) == 0) {
prime = false;
break;
}
}
if (prime) {
var place = String(num).length;
if (place <= 3)
console.log("Hundreds: "+num);
else if (place <= 5)
console.log("Thousands: "+num);
else if (place === 6)
console.log("Hundred thousands: "+num);
else if (place <= 8)
console.log("Millions: "+num);
else if (place === 9)
console.log("Hundred millions: "+num);
else if (place >= 10)
console.log("Billions or above: "+num);
primes.push(num.toString(32));
latestPrimes += ",\n\t"+num.toString(32)
}
if ((num - 1) % 5000000 == 0) {
console.log('amount of primes:', primes.length)
fs.appendFileSync("Primes.txt", latestPrimes)
console.log("Primes dumped");
latestPrimes = ""
}
num += 2;
}
停止程序时,只需将字符串"\n]"
添加到文件末尾即可关闭数组。