Node.js 不写入文件?

and*_*rew 2 node.js

我正在尝试制作一个质数筛,它对我来说效果很好。但是,它不会将数据写入文件。它说素数被转储到一个文件中。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)

Cas*_*ohg 5

通过运行您的代码,我得出的结论是素数计算以某种方式干扰了文件写入。所以我尝试使用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]"到文件末尾即可关闭数组。