Javascript'te bir Dizi'nin maksimum boyutu


108

Bağlam: Bir rss beslemesini okuyan ve beslemeyi arka planda güncelleyen / kontrol eden küçük bir site oluşturuyorum. Görüntülenecek verileri depolamak için bir dizim ve gösterilen kayıtların kimliklerini saklayan başka bir dizim var.

Soru: İşler yavaşlamaya veya durgunlaşmaya başlamadan önce bir dizi Javascript'te kaç öğe tutabilir? Diziyi sıralamıyorum, ancak karşılaştırma yapmak için jQuery'nin inArray işlevini kullanıyorum.

Web sitesi çalışır durumda bırakılacak ve güncellenecek ve tarayıcının bu kadar sık ​​yeniden başlatılması / yenilenmesi olasılığı düşüktür.

Diziden bazı kayıtları temizlemeyi düşünürsem, 100 öğe gibi bir sınırdan sonra bazı kayıtları kaldırmanın en iyi yolu nedir?


3
Muhtemelen tarayıcı bellek sızıntısı araç çubuklarından JS kodundan daha fazla sorunla karşılaşacaksınız. :) Firefox 4 Parmağımı size doğrultuyorum.
epascarello

1
Diziyi ne sıklıkla kontrol ediyorsunuz (örn. 2s aralığı)? Yavaş olan nedir (örn> 500 ms)? Diziniz hangi büyüklük sırasına göre (örneğin binlerce, milyonlarca, milyarlarca)?
zzzzBov


Diziyi her dakika kontrol edip güncelleyeceğim. Ve evet halsizlik, bu yüklemeyi ve kontrolü etkilemeye başlayan bir performans vuruşu ve sayfadaki diğer animasyonları, tanımlaması zor, üzgünüm!
sevgiyle

@Amine Bağlantı için teşekkürler, bu web sitesi yeni en iyi arkadaşım olacak gibi görünüyor :)
hoş

Yanıtlar:


153

"Yavaşlayana" kadar maksimum uzunluk tamamen hedef makinenize ve gerçek kodunuza bağlıdır, bu nedenle neyin kabul edilebilir olduğunu görmek için bu (o) platformlarda test etmeniz gerekir.

Bununla birlikte, ECMA-262 5. Baskı spesifikasyonuna göre bir dizinin maksimum uzunluğu, ToUint32 soyut işlemi nedeniyle işaretsiz 32 bitlik bir tamsayı ile sınırlıdır , bu nedenle olası en uzun dizi 2 32 -1 = 4,294,967,295 = 4,29 milyar öğeye sahip olabilir .


13
@ Barkermn01: ECMA-262 5th Edition belirtimi , uzunluğunu değiştiren herhangi bir işlemde bir dizinin uzunluğunu kontrol etmek için ToUint32 soyut işlemini kullanır , bu nedenle makinenin (veya web tarayıcısının) temel mimarisinin alakasız olduğunu düşünüyorum.
maerics

1
hrm güzel sadece harika bir 64Bit tarayıcısının anlamsız
yanıyor

3
@ Barkermn01, 64bit tarayıcılarda hala birçok başka iyileştirme var. JavaScript yorumlayıcısı olmanın bir tarayıcının yaptığı tek şey olmadığını unutmayın.
Razor Storm

1
Wowzer bu kadar yüksek olmasını beklemiyordu. Tamam güzel, iyi olacağımı düşünüyorum!
sevgiyle

Aslında bir dizi en fazla 4294967295 (2 ^ 31-1) öğeye sahip olabilir. Bkz stackoverflow.com/a/12766547/396458
NullUserException

26

Diziyi kırpmaya gerek yok, onu dairesel bir tampon olarak ele alın (dizin% maxlen). Bu, hiçbir zaman sınırı aşmamasını sağlayacaktır (dairesel bir tampon uygulamak, sona geldiğinizde yeniden başa dönmeniz anlamına gelir - dizinin sonunu aşmak mümkün değildir).

Örneğin:

var container = new Array ();
var maxlen = 100;
var index = 0;

// 'store' 1538 items (only the last 'maxlen' items are kept)
for (var i=0; i<1538; i++) {
   container [index++ % maxlen] = "storing" + i;
}

// get element at index 11 (you want the 11th item in the array)
eleventh = container [(index + 11) % maxlen];

// get element at index 11 (you want the 11th item in the array)
thirtyfifth = container [(index + 35) % maxlen];

// print out all 100 elements that we have left in the array, note
// that it doesn't matter if we address past 100 - circular buffer
// so we'll simply get back to the beginning if we do that.
for (i=0; i<200; i++) {
   document.write (container[(index + i) % maxlen] + "<br>\n");
}

4
Akıllıca bir fikir, ancak bunu yaparak potansiyel verilerin üzerine yazacak, dizinleri karıştıracak ve muhtemelen garip davranışlarla sonuçlanacaksın.
john ktejik

9
Buradaki fikir, bir halka tampon uygulamaktır, yani evet - kasıtlı olarak eski verileri "unutuyorsunuz" (halka tampon bunun için kullanılır) ve soruyu soran kişi bunu istedi.
Lelanthran

1
SO'ya tıklamaktan sıkıldım ve bu yanıtı buldum. Gerektiği gibi indekslerin üzerine yazarak tekniği sevin.
Kyle Hotchkiss

5

Uzunluğu test etmek ve kısaltmak için buna benzer bir şey deneyebilirsiniz:

http://jsfiddle.net/orolo/wJDXL/

var longArray = [1, 2, 3, 4, 5, 6, 7, 8];

if (longArray.length >= 6) {
  longArray.length = 3;
}

alert(longArray); //1, 2, 3


2
Dizinin başından itibaren kırpmam gerektiği için dilim kullanmaya başladım, yine de teşekkürler.
sevgiyle

3

@Maerics'in dediği gibi, hedef makineniz ve tarayıcınız performansı belirleyecektir.

Ancak, 2017 kurumsal Chromebook'umda operasyonu yürüten bazı gerçek dünya rakamları için:

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
  • x=5e4 16 ms sürer, 60 fps için yeterince iyi
  • x=4e6 250 ms sürer, bu fark edilir ancak önemli değildir
  • x=3e7 1300 ms sürer, bu oldukça kötü
  • x=4e7 11000 ms sürer ve fazladan 2,5 GB bellek ayırır

Dolayısıyla, yaklaşık 30 milyon öğe zor bir üst sınırdır, çünkü javascript VM 40 milyon öğeyle bir uçurumdan düşer ve muhtemelen süreci çökertecektir.


2

Milyonlarca veri kümesini işleyen ve grafiğini çizen bir performans çerçevesi oluşturdum ve o zaman bile javascript hesaplama gecikmesi onlarca milisaniye düzeyindeydi. Dizi boyutu sınırını aşmaktan endişelenmediğiniz sürece, endişelenmeniz gereken çok şey olduğunu sanmıyorum.


0

Tarayıcıya çok bağlı olacaktır. 100 öğe kulağa çok büyük bir sayı gibi gelmiyor - bundan çok daha yükseğe çıkabileceğinizi umuyorum. Binlercesi sorun olmamalı. Sorun olabilecek şey, toplam hafıza tüketimidir.


0

Bellekte bazı oldukça büyük veri kümelerini utanmadan çektim ve yavaşlamasına rağmen, veri kümesinde oldukça yoğun hesaplamalarla belki 15 Mo veriyi yukarı doğru götürdü. Veriler üzerinde yoğun hesaplamalarınız ve birçok satırınız yoksa, bellekle ilgili sorun yaşayacağınızdan şüpheliyim. Farklı sahte sonuç kümeleriyle profil oluşturma ve kıyaslama, performansı değerlendirmek için en iyi seçeneğiniz olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.