2016-04-09 20 views
1

2^32 = 4294967296 boyutunda bir dizi oluşturmaya çalışıyorum çünkü elek algoritmasını çalıştırarak 2^32'ye kadar tüm asal sayıları almaya çalışıyorum. Ancak bu dizideki herhangi bir işlem aşağıdaki hatayı alıyorum:Javascript Maksimum dizi boyutunu artırın

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

Abort trap: 6

Yukarıdaki durumlarda ne yapabilirim?

+0

kullanımı yerine seyrek diziler nesne. – dandavis

+7

Bu 4 milyar elementtir. Neden bu boyuta ihtiyacın var? – Andy

+1

Yine de, 4294967295 yerine ((2^32) - 1) deneyin. – Andy

cevap

1

Diziler o kadar büyük olamaz, maksimum uzunluk 2 -1 dir. ECMAScript spec, bir elek algoritması için

Every Array object has a length property whose value is always a nonnegative integer less than 232.

A String property name P is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to 232−1.

+0

Onun etiketinin "node.js" olduğunu ve hikayenin farklı olduğunu düşünün. – skobaljic

+0

@skobaljic Node.js bir ECMAScript uygulamasıdır. – Oriol

+0

Daha iyi bildiğini tahmin et. Bildiğim kadarıyla, sadece Javascript'in motoru üzerine kurulu ve tarayıcıda Javascript'ten çok farklı olan birçok yolu genişletebilirsiniz. – skobaljic

6

2^32 öğesinin bir öğesi temel olarak 4 GB * size of an element şeklindedir, dolayısıyla belleğe sığmayacak yüksek olasılıklar vardır.

Aldığınız hata tam olarak budur: Allocator yeterince yer ayıramaz. Birkaç gigabayt dizisi ayırmaktan başka bir çözüm düşünmek isteyebilirsiniz. Neyi başarmaya çalıştığınız hakkında biraz daha fazla ayrıntıya sahip olmak sizi doğru yola koymanıza yardımcı olabilir!

+0

Tüm asal sayıları 2^32'ye kadar elde etmeye ve elek algoritmasını çalıştırmaya çalışıyorum. –

3

node.js için big-array'u yükleyin.

A resizable array using non-sequential block memory allocation. Growing or shrinking the array does not require reallocation of the entire array. Useful when you need to track a few trillion data points.

1

göre, ... bir bitset uygulanması (örneğin https://github.com/tdegrunt/bitset) için

bak her sayı test etmek için sadece bir bit gerekir. Bu, bit'leri ayarladığınız sırada dinamik olarak büyüyecektir. Biti kurabilir ve alabilirsiniz ve her bit size n'un bir öncelik olup olmadığını söyleyecektir.

Ancak, ben Aslında ... bu yavaş olacaktır çünkü ... max 100 değil, 2^32 ile sınamak

tavsiye benim Mac 10M ve 100M arasındaki bitset sonları. Sanırım bayt dizisi kullanmıyorlar.

kahve komut dosyasında

daha az ayrıntılı çünkü ...

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 
İlgili konular