Javascript增加最大数组大小

我想创build一个大小为2^32 = 4294967296的数组,因为我试图通过运行筛选algorithm来获得所有素数直到2 ^ 32。 然而,在该数组中的任何操作,我得到以下错误:

致命错误:CALL_AND_RETRY_LAST分配失败 – 进程内存不足

中止陷阱:6

以上情况我能做些什么?

arrays不能那么大,最大长度是2 32 -1。 根据ECMAScript规范,

每个数组对象都有一个长度属性,其值始终是一个小于2 32的非负整数。

当且仅当ToString(ToUint32( P ))等于P且ToUint32( P )不等于2 32 -1时,String属性名称P才是数组索引

一个2^32元素的数组基本上4 GB * size of an element ,所以很有可能不适合内存。

你得到的错误正是:分配器不能分配足够的空间。 您可能需要考虑另一个解决scheme,而不是分配几个千兆字节的数组。 有关你想要达到的更多细节可以帮助你走上正轨! 🙂

对于node.js只需安装big-array 。

使用非顺序块存储器分配的可resize的数组。 增大或缩小数组不需要重新分配整个数组。 当您需要跟踪几万亿个数据点时很有用。

对于筛选algorithm,每个数字只需要一位就可以testing…

寻找一个bitset实现(例如https://github.com/tdegrunt/bitset )。 这个会随着你设置的位数而dynamic增长。 你可以设置和获取位,并且每个位都会告诉你n是否为素数。

但是,我build议你testing最大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