Nel mio sito Web ho molti array con dati. per esempio: array di vertici, matrice di colori, matrice di dimensioni ...Il modo migliore per inserire elementi nell'array?
Sto lavorando con grandi quantità di articoli. Fino a decine di milioni.
Prima di aggiungere i dati negli array, è necessario elaborarlo. Fino ad ora, l'ho fatto nel thread principale e questo ha reso il mio sito web congelato per X secondi. Si è bloccato a causa dell'elaborazione e dell'aggiunta dei dati elaborati negli array.
Oggi ho "spostato" (fatto molto lavoro) l'elaborazione in web worker, ma i dati elaborati vengono aggiunti nel thread principale. Sono riuscito a risparmiare il tempo di congelamento dell'elaborazione ma non dell'aggiunta.
L'aggiunta è fatta semplicemente da array.push()
o array.splice()
.
Ho letto alcuni articoli su come funziona la matrice e ho scoperto che quando aggiungiamo un elemento a un array, l'array viene copiato completamente in una nuova posizione nella memoria con la dimensione array.length + 1
e lì aggiungendo il valore. Questo rallenta i miei dati.
Ho anche letto che l'array tipizzato è molto più veloce. Ma per questo avrei bisogno di conoscere la dimensione dell'array, che non conosco, e per creare un grande array tipizzato con un contatore extra e gestire l'aggiunta di elementi nel mezzo (e non la fine dell'array) sarebbe un molto cambiamento di codice, che non voglio fare in questo momento.
Quindi, per la mia domanda, Ho TypedArray che restituisce dal web worker, e questo ho bisogno di mettere in serie normale. Qual è il modo migliore per farlo? (oggi sono in esecuzione in un ciclo e spingendo uno dopo l'altro)
EDIT
Esempio di come il lavoro sito: il cliente aggiungere numero di elementi, diciamo 100000. Le voci grezzo i dati vengono raccolti e inviati al lavoratore. L'operatore sta elaborando tutte le informazioni e inviando i dati elaborati come array tipizzato (per l'utilizzo come oggetti trasferibili). Nel thread principale stiamo aggiungendo i dati elaborati agli array - alla fine o in qualche indice specifico. 2 ° turno. il cliente aggiunge altri 100000 articoli. invio al lavoratore e il risultato viene aggiunto agli array di thread principali. 3 ° round può essere di 10 elementi, 4 ° round 10000, 5 ° round può rimuovere gli indici 10-2000, ...
Suona come si dovrebbe essere il caching. Inoltre, hai davvero/bisogno/tutti i dati nel client allo stesso tempo? – tyteen4a03
Restituire un array tipizzato dal web worker e quindi rimetterlo in un array normale sarebbe probabilmente più lento di inserirlo in un array sul thread principale in primo luogo. –
Potrebbe essere necessario copiare l'array originale e quindi mutare quello nuovo nel worker. Se l'array originale non contiene oggetti, puoi copiarlo con 'Array # slice'. – Pavlo