我正在尝试创建一个大小为getOrInsert()
的数组,因为我试图通过运行筛选算法将所有素数加到2 ^ 32。但是,该数组中的任何操作都会出现以下错误:
致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足
中止陷阱:6
在上述情况下我该怎么办?
答案 0 :(得分:6)
2^32
元素的数组基本上是4 GB * size of an element
,因此很有可能它不适合内存。
您获得的错误就是:分配器无法分配足够的空间。您可能想要考虑另一种解决方案,而不是分配几千兆字节的数组。详细了解您想要实现的目标可以帮助您走上正轨! :)
答案 1 :(得分:3)
对于node.js
,只需安装big-array即可。
使用非顺序块内存分配的可调整大小的数组。 增长或缩小阵列不需要重新分配 整个阵列。当您需要跟踪几万亿个数据时非常有用 分。
答案 2 :(得分:2)
阵列不能那么大,最大长度为2 32 -1。根据{{3}}规范,
每个Array对象都有一个length属性,其值始终为a 非负整数小于2 32 。
字符串属性名称 P 是数组索引当且仅当 ToString(ToUint32( P ))等于 P 且ToUint32( P )不等于 到2 32 -1。
答案 3 :(得分:1)
对于筛选算法,每个数字只需要一位来测试......
查找bitset实现(例如https://github.com/tdegrunt/bitset)。
当你在其中设置位时,这个将动态增长。您可以设置和获取位,每个位都会告诉您n
是否为素数。
但是,我建议你测试最大100,而不是2 ^ 32 ......因为它会很慢......
实际上,我的Mac上的bitset在10M到100M之间中断。我猜他们不会使用字节数组。
在咖啡脚本中,因为它不那么冗长......
Bitset = require 'bitset'
sieve = (maxSize)=>
mark = (bitset)->
markMultiplesOf = (n)->
bitset.set(n*each) for each in [2..(maxSize / n)]
markMultiplesOf each for each in [2..(maxSize / 2)] when bitset.get(each) is false
showPrimes = (bitset)->
console.log each for each in [0..(bitset.length())] when bitset.get(each) is false
timestamp = Date.now()
bitset = new Bitset(maxSize)
mark bitset, maxSize
console.log "took #{Date.now() - timestamp} ms"
showPrimes(bitset)
sieve(10000000) # takes < 4s