【问题标题】:Javascript Increase max array size [duplicate]Javascript增加最大数组大小[重复]
【发布时间】:2016-07-31 02:41:36
【问题描述】:

我正在尝试创建一个大小为2^32 = 4294967296 的数组,因为我正在尝试通过运行筛算法来获取直到 2^32 的所有素数。但是,该数组中的任何操作都会出现以下错误:

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

中止陷阱:6

以上情况我该怎么办?

【问题讨论】:

  • 使用对象而不是稀疏数组。
  • 这是 40 亿个元素。为什么需要这么大的数组?
  • 不管怎样,试试 4294967295 ((2^32) - 1)。
  • 我建议您解释您要解决的实际问题,以便我们可以为您提供除分配巨大数组之外的其他解决方法。
  • 基本上,我试图通过运行 sieve 来获得 2^32 以内的所有素数。

标签: javascript node.js


【解决方案1】:

数组不能那么大,最大长度是232-1。根据ECMAScript 规范,

每个 Array 对象都有一个长度属性,其值始终为 小于 232 的非负整数。

一个字符串属性名P是一个数组索引当且仅当 ToString(ToUint32(P)) 等于 P 而 ToUint32(P) 不等于 到 232-1.

【讨论】:

  • 认为他的标签是node.js 和故事不同。
  • @skobaljic Node.js 是一个 ECMAScript 实现。
  • 猜你更清楚。据我所知,它只是基于 Javascript 引擎构建的,您可以通过多种方式对其进行扩展,这与浏览器中的 Javascript 大不相同。
【解决方案2】:

2^32 元素的数组基本上是4 GB * size of an element,因此它很可能不适合内存。

您得到的错误正是:分配器无法分配足够的空间。您可能需要考虑另一种解决方案,而不是分配几个 GB 的数组。详细了解您要实现的目标可以帮助您走上正确的轨道! :)

【讨论】:

  • 我正在尝试获取所有素数直到 2^32 并尝试运行筛算法。
  • 由于人为限制,它很可能无法放入内存中......
【解决方案3】:

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

使用非顺序块内存分配的可调整大小的数组。 扩大或缩小数组不需要重新分配 整个阵列。当您需要跟踪数万亿数据时很有用 点。

【讨论】:

    【解决方案4】:

    对于筛算法,您只需要一个位来测试每个数字...

    寻找一个 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
    

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 2012-11-10
      • 2018-01-04
      • 2011-09-02
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多