Ukuran maksimum Array dalam Javascript

108

Konteks: Saya sedang membangun situs kecil yang membaca rss feed, dan mengupdate / memeriksa feed di latar belakang. Saya memiliki satu larik untuk menyimpan data untuk ditampilkan, dan larik lainnya yang menyimpan ID catatan yang telah ditampilkan.

Pertanyaan: Berapa banyak item yang dapat ditampung sebuah array dalam Javascript sebelum semuanya mulai menjadi lambat, atau lamban. Saya tidak menyortir array, tetapi saya menggunakan fungsi inArray jQuery untuk melakukan perbandingan.

Situs web akan dibiarkan berjalan, dan diperbarui dan kemungkinan kecil browser akan direstart / disegarkan sesering itu.

Jika saya harus berpikir tentang menghapus beberapa catatan dari larik, apa cara terbaik untuk menghapus beberapa catatan setelah batas, seperti 100 item.

lebih indah
sumber
3
Anda mungkin akan mengalami lebih banyak masalah dengan browser yang membocorkan memori dari toolbar daripada dari kode JS. :) Firefox 4 Saya mengarahkan jari saya ke Anda.
epascarello
1
Seberapa sering Anda memeriksa larik (misal interval 2s)? Apa yang termasuk lamban (misal> 500ms)? Berapa urutan besarnya array Anda (misalnya ribuan, jutaan, miliar)?
zzzzBov
2
lakukan pengujian benchmark dengan jsperf.com
VirtualTroll
Saya akan memeriksa dan memperbarui array setiap menit. Dan ya, lamban akan menjadi hit kinerja yang mulai memengaruhi pemuatan dan pemeriksaan itu, dan animasi lain di laman, sulit untuk didefinisikan maaf!
ditambahkan dengan indah
@Amine terima kasih untuk tautannya, sepertinya situs web itu akan menjadi sahabat baru saya :)
addlovely

Jawaban:

153

Panjang maksimum hingga "menjadi lamban" sepenuhnya bergantung pada mesin target dan kode Anda yang sebenarnya, jadi Anda perlu menguji platform (itu) untuk melihat apa yang dapat diterima.

Namun, panjang maksimum sebuah larik sesuai dengan spesifikasi ECMA-262 Edisi ke-5 terikat oleh bilangan bulat 32-bit yang tidak bertanda tangan karena operasi abstrak ToUint32 , sehingga larik terpanjang dapat memiliki 2 32 -1 = 4.294.967.295 = 4.29 miliar elemen .

maerics
sumber
13
@ Barkermn01: spesifikasi ECMA-262 Edisi ke-5 menggunakan operasi abstrak ToUint32 untuk memeriksa panjang array pada setiap operasi yang mengubah panjangnya, jadi menurut saya arsitektur yang mendasari mesin (atau browser web) tidak relevan.
maerics
1
hrm bagus baru saja membaca bahwa satu browser
64Bit
3
@ Barkermn01, browser 64bit masih memiliki banyak perbaikan lainnya. Ingatlah bahwa menjadi juru bahasa javascript bukanlah satu-satunya hal yang dilakukan browser.
Razor Storm
1
Wowzer tidak menyangka akan setinggi itu. OK bagus, saya pikir saya akan baik-baik saja!
ditambahkan dengan indah
Sebenarnya sebuah array dapat memiliki paling banyak 4294967295 (2 ^ 31-1) elemen. Lihat stackoverflow.com/a/12766547/396458
NullUserException
26

Tidak perlu memangkas array, cukup atasi sebagai buffer melingkar (index% maxlen). Ini akan memastikan itu tidak pernah melewati batas (menerapkan buffer melingkar berarti bahwa begitu Anda mencapai akhir, Anda membungkusnya ke awal lagi - tidak mungkin untuk membanjiri akhir larik).

Sebagai contoh:

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
sumber
4
Ide yang cerdas, tetapi dengan melakukan ini Anda akan berpotensi menimpa data, membingungkan indeks, dan mungkin mengakibatkan perilaku yang aneh.
john ktejik
9
Idenya adalah untuk mengimplementasikan buffer cincin, jadi ya - Anda sengaja "melupakan" data lama (untuk itulah buffer cincin digunakan) dan itulah yang diminta oleh penanya.
Lelanthran
1
Saya hanya bosan mengklik SO dan menemukan tanggapan ini. suka teknik dengan menimpa indeks sesuai kebutuhan.
Kyle Hotchkiss
5

Anda dapat mencoba sesuatu seperti ini untuk menguji dan memotong panjangnya:

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
sumber
2
Akhirnya menggunakan slice karena saya perlu memangkas dari awal array, terima kasih.
addlovely
3

Seperti yang dikatakan @maerics, mesin target dan browser Anda akan menentukan kinerja.

Tetapi untuk beberapa nomor dunia nyata, di Chromebook perusahaan tahun 2017 saya, menjalankan operasi:

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
  • x=5e4 membutuhkan 16ms, cukup baik untuk 60fps
  • x=4e6 membutuhkan 250ms, yang terlihat tetapi bukan masalah besar
  • x=3e7 membutuhkan waktu 1300ms, yang sangat buruk
  • x=4e7 membutuhkan waktu 11000ms dan mengalokasikan tambahan memori 2.5GB

Jadi, sekitar 30 juta elemen adalah batas atas yang sulit, karena VM javascript jatuh dari tebing dengan 40 juta elemen dan mungkin akan menghentikan proses.

Carl Walsh
sumber
2

Saya telah membangun kerangka kinerja yang memanipulasi dan membuat grafik jutaan kumpulan data, dan bahkan kemudian, latensi penghitungan javascript berada di urutan puluhan milidetik. Kecuali Anda khawatir akan melampaui batas ukuran array, saya rasa Anda tidak perlu terlalu khawatir.

Razor Storm
sumber
0

Ini akan sangat bergantung pada browser. 100 item kedengarannya bukan angka yang besar - Saya harap Anda bisa lebih tinggi dari itu. Ribuan seharusnya tidak menjadi masalah. Yang mungkin menjadi masalah adalah konsumsi memori total.

rjmunro
sumber
0

Saya tanpa malu-malu telah menarik beberapa kumpulan data yang cukup besar dalam memori, dan meskipun hal itu menjadi lamban, mungkin diperlukan waktu sekitar 15 Mo data ke atas dengan perhitungan yang cukup intens pada kumpulan data tersebut. Saya ragu Anda akan mengalami masalah dengan memori kecuali Anda memiliki perhitungan yang intens pada data dan banyak baris. Pembuatan profil dan pembandingan dengan kumpulan hasil tiruan yang berbeda akan menjadi pilihan terbaik Anda untuk mengevaluasi kinerja.

stefgosselin.dll
sumber