程序功能是将质数依次写入文件, 执行 ts-node main.ts
, 代码在下面
常规判断是否是质数, 是逐个判断 [2, Math.sqrt(num)]
是否能整除目标数, 我的思路是维护一个质数数组, 先从该数组中逐个判断是否能整除, 然后再依次加一, 效率还行(?), 每秒能判断十万个左右, 加上写入文件的话每秒能 1.5 万个左右
但是跑到 2.2 千万时, 程序报错了, 重新执行, 从 2.2 千万跑到 3.5 千万时又报错了; 就我的渣渣水平来看, 大概是内存溢出? 但是我从头到尾看了我的程序, 除了那个质数数组一直占用内存, 其他的变量应该都能被回收啊, cpu 占用也一直在 50%左右, 不高啊, 求助为什么崩了呢?
部分报错如下
[4828:000002AA1DB95410] 818854 ms: Mark-sweep 1753.6 (2051.2) -> 1753.6 (2051.2) ms (average mu = 0.191, current mu = 0.000) last resort GC in old space requeste
[4828:000002AA1DB95410] 819628 ms: Mark-sweep 1753.6 (2051.2) -> 1753.6 (2052.2) ms (average mu = 0.207, current mu = 0.227) allocation failure GC in old space r
...
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScr
memory
------------ 代码 -----------
// main.ts
import * as fs from "fs"
const primeStr = fs.readFileSync("primes.txt", {
encoding: "utf-8",
flag: "a+",
})
const primes = primeStr.split(",").map((n) => +n).filter((n) => n >= 2)
let primeLastIdx = primes.length - 1
function checkIsInt(num: number) { return num === num >> 0 }
/**
* 返回 a 是否是 b 的因子
*
* 返回值 true: 是因子
* 返回值 false: 不是因子, 且大于 a 的数都不是因子
* 返回值 1: 不是因子, 但大于 a 的数可能存在因子
*/
function isFactorOf(a: number, b: number) {
const devided = b / a
if (a > devided) { return false }
if (checkIsInt(devided)) { return true }
return 1
}
function checkIsPrime(num: number) {
let prime: number
for (let i = 0; i <= primeLastIdx; i += 1) {
prime = primes[i]
const isFactor = isFactorOf(prime, num)
if (isFactor === 1) {
continue
}
return !isFactor
}
for (let i = prime + 1; true; i += 1) {
const isFactor = isFactorOf(i, num)
if (isFactor === 1) {
continue
}
return !isFactor
}
}
function main() {
for (let i = primes[primeLastIdx] + 1 || 2; i < 101000000; i += 1) {
process.stdout.write(`\r${i}`)
if (checkIsPrime(i)) {
primeLastIdx += 1
primes.push(i)
fs.writeFileSync("./primes.txt", `${i},`, {
encoding: "utf-8",
flag: "a+",
})
}
}
}
main()
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.