Dimensione massima di un array in Javascript


108

Contesto: sto costruendo un piccolo sito che legge un feed RSS e aggiorna / controlla il feed in background. Ho un array per memorizzare i dati da visualizzare e un altro che memorizza gli ID dei record che sono stati mostrati.

Domanda: quanti elementi può contenere un array in Javascript prima che le cose inizino a diventare lente o lente. Non sto ordinando l'array, ma sto usando la funzione inArray di jQuery per fare un confronto.

Il sito Web verrà lasciato in esecuzione e l'aggiornamento ed è improbabile che il browser venga riavviato / aggiornato così spesso.

Se dovessi pensare di cancellare alcuni record dall'array, qual è il modo migliore per rimuovere alcuni record dopo un limite, come 100 elementi.


3
Probabilmente incontrerai più problemi con il browser che perde memoria dalle barre degli strumenti che dal codice JS. :) Firefox 4 Punto il dito contro di te.
epascarello

1
Con che frequenza controlli l'array (ex intervallo 2s)? Cosa costituisce lento (ex> 500 ms)? Quale ordine di grandezza è il tuo array (ex migliaia, milioni, miliardi)?
zzzzBov

2
fare test di benchmark con jsperf.com
VirtualTroll

Controllerò e aggiornerò l'array ogni minuto. E sì, lento sarebbe un successo di prestazioni che inizia ad effettuare quel caricamento e il controllo, e altre animazioni sulla pagina, difficili da definire mi dispiace!
aggiunto adorabile

@Amine grazie per il link, sembra che quel sito web sarà il mio nuovo migliore amico :)
aggiunto lovely

Risposte:


153

La lunghezza massima fino a quando "diventa lento" dipende totalmente dalla macchina di destinazione e dal codice effettivo, quindi dovrai testare su quella (quelle) piattaforma (e) per vedere cosa è accettabile.

Tuttavia, la lunghezza massima di un array secondo la-262 ECMA specifica Edition 5a è vincolato da un 32 bit senza segno intero dovuto al ToUint32 operazione astratta, quindi l'array più lunga possibile potrebbe avere 2 32 -1 = 4294967295 = 4.29 miliardi elementi .


13
@ Barkermn01: la specifica ECMA-262 5a edizione utilizza l'operazione astratta ToUint32 per controllare la lunghezza di un array su qualsiasi operazione che ne modifichi la lunghezza, quindi penso che l'architettura sottostante della macchina (o del browser web) sia irrilevante.
maerie

1
hrm nice ho appena letto che un fantastico browser a 64 bit è fiammeggiante e inutile,
Barkermn01

3
@ Barkermn01, i browser a 64 bit hanno ancora molti altri miglioramenti. Ricorda che essere un interprete javascript non è l'unica cosa che fa un browser.
Razor Storm

1
Wowzer non si sarebbe aspettato che fosse così alto. OK bello, penso che starò bene!
aggiunto adorabile

In realtà un array può avere al massimo 4294967295 (2 ^ 31-1) elementi. Vedere stackoverflow.com/a/12766547/396458
NullUserException

26

Non è necessario tagliare l'array, indirizzalo semplicemente come buffer circolare (indice% maxlen). Ciò garantirà che non superi mai il limite (implementare un buffer circolare significa che una volta arrivati ​​alla fine si va di nuovo all'inizio, non è possibile superare la fine dell'array).

Per esempio:

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
Idea intelligente, ma in questo modo potresti sovrascrivere i dati, confondere gli indici e causare uno strano comportamento.
john ktejik

9
L'idea è di implementare un ring-buffer, quindi sì - stai intenzionalmente "dimenticando" i vecchi dati (questo è ciò per cui viene utilizzato un ring-buffer) ed era ciò che l'interrogante ha chiesto.
Lelanthran

1
Ero solo annoiato a fare clic su SO e ho trovato questa risposta. amo la tecnica con la sovrascrittura degli indici secondo necessità.
Kyle Hotchkiss

5

Potresti provare qualcosa di simile per testare e tagliare la lunghezza:

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
Ho finito per usare slice perché avevo bisogno di tagliare dall'inizio dell'array, grazie però.
aggiunto adorabile

3

Come ha detto @maerics, il computer e il browser di destinazione determineranno le prestazioni.

Ma per alcuni numeri del mondo reale, sul mio Chromebook aziendale del 2017, che esegue l'operazione:

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
  • x=5e4 richiede 16 ms, abbastanza buono per 60 fps
  • x=4e6 impiega 250 ms, il che è evidente ma non è un grosso problema
  • x=3e7 impiega 1300 ms, il che è piuttosto brutto
  • x=4e7 richiede 11000 ms e alloca 2,5 GB di memoria extra

Quindi circa 30 milioni di elementi è un limite massimo, perché la VM javascript cade da un dirupo a 40 milioni di elementi e probabilmente bloccherà il processo.


2

Ho creato un framework delle prestazioni che manipola e rappresenta graficamente milioni di set di dati e, anche allora, la latenza di calcolo di javascript era dell'ordine di decine di millisecondi. A meno che tu non sia preoccupato di superare il limite di dimensione dell'array, non penso che tu abbia molto di cui preoccuparti.


0

Dipenderà molto dal browser. 100 elementi non sembrano un numero elevato, mi aspetto che potresti andare molto più in alto di quello. Migliaia non dovrebbero essere un problema. Quello che potrebbe essere un problema è il consumo totale di memoria.


0

Ho spudoratamente tirato fuori alcuni set di dati piuttosto grandi in memoria, e anche se è diventato lento ci sono voluti forse 15 Mo di dati verso l'alto con calcoli piuttosto intensi sul set di dati. Dubito che incorrerai in problemi con la memoria a meno che tu non abbia calcoli intensi sui dati e molte molte righe. La profilazione e il benchmarking con diversi set di risultati fittizi saranno la soluzione migliore per valutare le prestazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.