Maksymalny rozmiar tablicy w JavaScript

108

Kontekst: Tworzę małą witrynę, która czyta kanał RSS i aktualizuje / sprawdza kanał w tle. Mam jedną tablicę do przechowywania danych do wyświetlenia i drugą, która przechowuje identyfikatory rekordów, które zostały pokazane.

Pytanie: Ile elementów może przechowywać tablica w Javascript, zanim wszystko zacznie się spowalniać lub powolnie. Nie sortuję tablicy, ale do porównania używam funkcji inArray jQuery.

Strona internetowa pozostanie uruchomiona, będzie aktualizowana i jest mało prawdopodobne, że przeglądarka będzie tak często restartowana / odświeżana.

Jeśli powinienem pomyśleć o wyczyszczeniu niektórych rekordów z tablicy, jaki jest najlepszy sposób na usunięcie niektórych rekordów po limicie, na przykład 100 pozycji.

dodane cudownie
źródło
3
Prawdopodobnie napotkasz więcej problemów z przeciekaniem pamięci przez przeglądarkę z pasków narzędzi niż z kodu JS. :) Firefox 4 Wskazuję na Ciebie palcem.
epascarello
1
Jak często sprawdzasz tablicę (np. Interwał 2s)? Co oznacza powolność (np.> 500 ms)? Jaki rząd wielkości jest twoją tablicą (np. Tysiące, miliony, miliardy)?
zzzzBov
2
wykonaj testy porównawcze z jsperf.com
VirtualTroll
Będę sprawdzać i aktualizować tablicę co minutę. I tak powolny byłby hitem wydajnościowym, który zaczyna powodować ładowanie i sprawdzanie oraz inne animacje na stronie, trudne do zdefiniowania, przepraszam!
dodano piękny
@Amina dzięki za link, wygląda na to, że ta strona będzie moim nowym najlepszym przyjacielem :)
dodano cudownie

Odpowiedzi:

153

Maksymalna długość do momentu, w którym „robi się wolno” jest całkowicie zależna od maszyny docelowej i rzeczywistego kodu, więc musisz przetestować na tej (tych) platformach, aby zobaczyć, co jest akceptowalne.

Jednakże, maksymalna długość tablicy według specyfikacji ECMA-262 Wydanie 5. jest związana unsigned 32-bitowej liczby całkowitej ze względu na ToUint32 streszczenie pracy tak najdłuższy tablica może mieć 2 32 -1 = 4294967295 = 4.29 miliarda elementy .

maerics
źródło
13
@ Barkermn01: specyfikacja ECMA-262 5th Edition używa abstrakcyjnej operacji ToUint32 do sprawdzania długości tablicy w dowolnej operacji, która modyfikuje jej długość, więc myślę, że podstawowa architektura maszyny (lub przeglądarki internetowej) jest nieistotna.
maerics
1
hrm fajnie właśnie przeczytałem, że jedna świetna przeglądarka 64
bitowa
3
@ Barkermn01, 64-bitowe przeglądarki wciąż mają wiele innych ulepszeń. Pamiętaj, że bycie interpretatorem javascript nie jest jedyną rzeczą, którą robi przeglądarka.
Razor Storm
1
Wowzer nie spodziewał się, że będzie tak wysoko. OK fajnie myślę, że będzie dobrze!
dodano piękny
W rzeczywistości tablica może mieć maksymalnie 4294967295 (2 ^ 31-1) elementów. Zobacz stackoverflow.com/a/12766547/396458
NullUserException
26

Nie ma potrzeby przycinania tablicy, wystarczy zaadresować ją jako bufor cykliczny (indeks% maxlen). Zapewni to, że nigdy nie przekroczy limitu (implementacja bufora cyklicznego oznacza, że ​​gdy dojdziesz do końca, zawiniesz ponownie do początku - nie jest możliwe przekroczenie końca tablicy).

Na przykład:

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");
}
Lelanthran
źródło
4
Sprytny pomysł, ale robiąc to, możesz potencjalnie nadpisać dane, myląc indeksy i prawdopodobnie powodując dziwne zachowanie.
john ktejik
9
Pomysł polega na zaimplementowaniu bufora pierścieniowego, więc tak - celowo „zapominasz” o starych danych (do tego służy bufor pierścieniowy) io to pytał pytający.
Lelanthran
1
Po prostu znudziłem się klikaniem wokół SO i znalazłem tę odpowiedź. uwielbiam tę technikę z nadpisywaniem indeksów w razie potrzeby.
Kyle Hotchkiss
5

Możesz spróbować czegoś takiego, aby przetestować i przyciąć długość:

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

orolo
źródło
2
Skończyło się na użyciu plastra, ponieważ musiałem przyciąć od początku tablicy, dzięki.
dodano piękny
3

Jak powiedział @maerics, Twoja maszyna docelowa i przeglądarka będą określać wydajność.

Ale dla niektórych rzeczywistych liczb na moim firmowym Chromebooku z 2017 r. Wykonuję operację:

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
  • x=5e4 trwa 16 ms, wystarczy na 60 klatek na sekundę
  • x=4e6 trwa 250 ms, co jest zauważalne, ale nie jest to wielka sprawa
  • x=3e7 trwa 1300 ms, co jest dość złe
  • x=4e7 trwa 11000 ms i przydziela dodatkowe 2,5 GB pamięci

Tak więc około 30 milionów elementów to sztywny górny limit, ponieważ maszyna wirtualna javascript spada z klifu przy 40 milionach elementów i prawdopodobnie spowoduje zawieszenie procesu.

Carl Walsh
źródło
2

Zbudowałem platformę wydajnościową, która manipuluje i tworzy wykresy milionów zestawów danych, a nawet wtedy opóźnienie obliczeń javascript było rzędu dziesiątek milisekund. Jeśli nie martwisz się przekroczeniem limitu rozmiaru tablicy, nie sądzę, że masz się o co martwić.

Razor Storm
źródło
0

Będzie to bardzo zależne od przeglądarki. 100 pozycji nie brzmi jak duża liczba - spodziewam się, że możesz iść dużo wyżej. Tysiące nie powinny stanowić problemu. Problemem może być całkowite zużycie pamięci.

rjmunro
źródło
0

Bezwstydnie pobrałem do pamięci kilka całkiem dużych zbiorów danych i chociaż zrobiło się to wolno, zajęło to może 15 Mo danych w górę z dość intensywnymi obliczeniami na zestawie danych. Wątpię, czy napotkasz problemy z pamięcią, chyba że masz intensywne obliczenia na danych i wiele, wiele wierszy. Profilowanie i testy porównawcze z różnymi próbnymi zestawami wyników będą najlepszym sposobem oceny wydajności.

stefgosselin
źródło