我正在尝试制作一个质数筛,它对我来说效果很好。但是,它不会将数据写入文件。它说素数被转储到一个文件中。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;
}
Run Code Online (Sandbox Code Playgroud)
通过运行您的代码,我得出的结论是素数计算以某种方式干扰了文件写入。所以我尝试使用fs.writeFileSync(...)并且它起作用了。与达到 5000000 阈值所需的时间相比,该文件实际上写入得相当快(从长远来看,它可能会开始花费大量时间,因为在文件写入和写入所有内容之间生成了超过 300000 个新素数以前的素数也是如此)。我真的不知道为什么异步方法不写它。计算素数可能太忙了。您知道,nodejs 异步调用不是并行的。
尝试这样的事情
...
if ((num - 1) % 5000000 == 0) {
fs.writeFileSync("Primes.txt", JSON.stringify(primes, null, '\t'))
console.log("Primes dumped");
}
...
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
当您停止程序时,您只需将字符串添加"\n]"到文件末尾即可关闭数组。
| 归档时间: |
|
| 查看次数: |
1752 次 |
| 最近记录: |