Node.js没有写入文件?

时间:2015-11-19 13:26:53

标签: 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;
}

1 个答案:

答案 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]"添加到文件末尾即可关闭数组。