Javascript增加最大数组大小

时间:2016-04-09 22:00:10

标签: javascript node.js

我正在尝试创建一个大小为getOrInsert()的数组,因为我试图通过运行筛选算法将所有素数加到2 ^ 32。但是,该数组中的任何操作都会出现以下错误:

  

致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足

     

中止陷阱:6

在上述情况下我该怎么办?

4 个答案:

答案 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