Hướng dẫn javascript max array size - kích thước mảng tối đa trong javascript

Bối cảnh: Tôi đang xây dựng một trang web nhỏ đọc nguồn cấp dữ liệu RSS và cập nhật/kiểm tra nguồn cấp dữ liệu trong nền. Tôi có một mảng để lưu trữ dữ liệu để hiển thị và một mảng khác lưu trữ các bản ghi ID đã được hiển thị.

Câu hỏi: Một mảng có thể giữ được bao nhiêu mục trong JavaScript trước khi mọi thứ bắt đầu trở nên chậm chạp, hoặc chậm chạp. Tôi không sắp xếp mảng, nhưng tôi đang sử dụng chức năng Inarray của JQuery để so sánh.

Trang web sẽ được chạy và cập nhật và không có khả năng trình duyệt sẽ được khởi động lại / làm mới thường xuyên.

Nếu tôi nên nghĩ về việc xóa một số hồ sơ từ mảng, cách tốt nhất để xóa một số hồ sơ sau một giới hạn, như 100 mục.

Hướng dẫn javascript max array size - kích thước mảng tối đa trong javascript

Bren

4.1563 Huy hiệu vàng25 Huy hiệu bạc43 Huy hiệu đồng3 gold badges25 silver badges43 bronze badges3 gold badges25 silver badges43 bronze badges

Khi được hỏi ngày 27 tháng 5 năm 2011 lúc 16:14May 27, 2011 at 16:14May 27, 2011 at 16:14

thêm vàoaddedlovelyaddedlovely

2.9973 Huy hiệu vàng21 Huy hiệu bạc35 Huy hiệu Đồng3 gold badges21 silver badges35 bronze badges3 gold badges21 silver badges35 bronze badges

5

Độ dài tối đa cho đến khi "nó trở nên chậm chạp" hoàn toàn phụ thuộc vào máy mục tiêu của bạn và mã thực tế của bạn, vì vậy bạn sẽ cần kiểm tra (các) nền tảng đó để xem những gì được chấp nhận.

Tuy nhiên, độ dài tối đa của một mảng theo thông số kỹ thuật phiên bản thứ 5 của ECMA-262 bị ràng buộc bởi một số nguyên 32 bit không dấu do hoạt động trừu tượng TOUINT32, do đó, mảng dài nhất có thể có 232-1 = 4.294.967.295 = 4.29 tỷ yếu tố.

Đã trả lời ngày 27 tháng 5 năm 2011 lúc 16:20May 27, 2011 at 16:20May 27, 2011 at 16:20

10

Không cần phải cắt mảng, chỉ cần giải quyết nó dưới dạng bộ đệm tròn (index % maxlen). Điều này sẽ đảm bảo nó không bao giờ vượt quá giới hạn (thực hiện bộ đệm tròn có nghĩa là một khi bạn đi đến cuối, bạn sẽ quấn lại từ đầu một lần nữa - không thể ghi đè kết thúc của mảng).

Ví dụ:

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] + "
\n"); }

Đã trả lời ngày 13 tháng 7 năm 2012 lúc 8:55Jul 13, 2012 at 8:55Jul 13, 2012 at 8:55

LelanthranlelanthranLelanthranLelanthran

1.48012 Huy hiệu bạc18 Huy hiệu đồng12 silver badges18 bronze badges12 silver badges18 bronze badges

3

Giống như @MAerics cho biết, máy mục tiêu và trình duyệt của bạn sẽ xác định hiệu suất.

Nhưng đối với một số số thế giới thực, trên Chromebook Enterprise 2017 của tôi, đang chạy hoạt động:

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
  • x=5e4 mất 16ms, đủ tốt cho 60fps
  • x=4e6 mất 250ms, điều này đáng chú ý nhưng không phải là vấn đề lớn
  • x=3e7 mất 1300ms, điều này khá tệ
  • x=4e7 mất 11000ms và phân bổ thêm 2,5GB bộ nhớ

Vì vậy, khoảng 30 triệu yếu tố là giới hạn trên cứng, bởi vì VM JavaScript rơi ra khỏi một vách đá với 40 triệu yếu tố và có thể sẽ làm hỏng quá trình này.


Chỉnh sửa: Trong mã trên, tôi thực sự điền vào mảng với các phần tử và lặp lại chúng, mô phỏng tối thiểu những gì một ứng dụng có thể muốn làm với một mảng. Nếu bạn chỉ chạy Array(2**32-1), bạn đang tạo một mảng thưa thớt gần với một đối tượng JavaScript trống với độ dài, như {length: 4294967295}. Nếu bạn thực sự đã cố gắng sử dụng tất cả 4 tỷ yếu tố đó, bạn chắc chắn sẽ làm hỏng quy trình JavaScript. In the code above, I'm actually filling the array with elements and looping over them, simulating the minimum of what an app might want to do with an array. If you just run Array(2**32-1) you're creating a sparse array that's closer to an empty JavaScript object with a length, like {length: 4294967295}. If you actually tried to use all those 4 billion elements, you'll definitely crash the javascript process. In the code above, I'm actually filling the array with elements and looping over them, simulating the minimum of what an app might want to do with an array. If you just run Array(2**32-1) you're creating a sparse array that's closer to an empty JavaScript object with a length, like {length: 4294967295}. If you actually tried to use all those 4 billion elements, you'll definitely crash the javascript process.

Đã trả lời ngày 7 tháng 11 năm 2019 lúc 7:23Nov 7, 2019 at 7:23Nov 7, 2019 at 7:23

Carl Walshcarl WalshCarl WalshCarl Walsh

5.4672 Huy hiệu vàng43 Huy hiệu bạc42 Huy hiệu Đồng2 gold badges43 silver badges42 bronze badges2 gold badges43 silver badges42 bronze badges

0

Bạn có thể thử một cái gì đó như thế này để kiểm tra và cắt độ dài:

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

Đã trả lời ngày 27 tháng 5 năm 2011 lúc 16:21May 27, 2011 at 16:21May 27, 2011 at 16:21

Oroloorolooroloorolo

3.9212 Huy hiệu vàng28 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges28 silver badges30 bronze badges2 gold badges28 silver badges30 bronze badges

1

Tôi đã xây dựng một khung hiệu suất thao tác và đồ thị hàng triệu bộ dữ liệu, và thậm chí sau đó, độ trễ tính toán của JavaScript là theo thứ tự hàng chục mili giây. Trừ khi bạn lo lắng về việc vượt quá giới hạn kích thước mảng, tôi không nghĩ bạn có nhiều điều phải lo lắng.

Đã trả lời ngày 27 tháng 5 năm 2011 lúc 17:07May 27, 2011 at 17:07May 27, 2011 at 17:07

Dao cạo Stormrazor StormRazor StormRazor Storm

Huy hiệu vàng 12K2085 Huy hiệu bạc146 Huy hiệu đồng20 gold badges85 silver badges146 bronze badges20 gold badges85 silver badges146 bronze badges

Nó sẽ phụ thuộc rất nhiều trình duyệt. 100 mặt hàng không giống như một số lượng lớn - Tôi hy vọng bạn có thể đi cao hơn rất nhiều so với thế. Hàng ngàn người không nên là một vấn đề. Những gì có thể là một vấn đề là tổng mức tiêu thụ bộ nhớ.

Đã trả lời ngày 27 tháng 5 năm 2011 lúc 16:23May 27, 2011 at 16:23May 27, 2011 at 16:23

rjmunrorjmunrorjmunrorjmunro

26.5K20 Huy hiệu vàng108 Huy hiệu bạc132 Huy hiệu Đồng20 gold badges108 silver badges132 bronze badges20 gold badges108 silver badges132 bronze badges

Tôi đã xấu hổ kéo một số bộ dữ liệu khá lớn trong bộ nhớ, và hoàn toàn nó đã trở nên chậm chạp, có thể mất 15 mo dữ liệu lên trên với các tính toán khá mạnh trên bộ dữ liệu. Tôi nghi ngờ bạn sẽ gặp vấn đề với bộ nhớ trừ khi bạn có tính toán cường độ cao trên dữ liệu và nhiều hàng. Hồ sơ và điểm chuẩn với các kết quả giả khác nhau sẽ là đặt cược tốt nhất của bạn để đánh giá hiệu suất.

Đã trả lời ngày 27 tháng 5 năm 2011 lúc 16:24May 27, 2011 at 16:24May 27, 2011 at 16:24

Stefgosselinstefgosselinstefgosselinstefgosselin

8.8925 Huy hiệu vàng40 Huy hiệu bạc66 Huy hiệu Đồng5 gold badges40 silver badges66 bronze badges5 gold badges40 silver badges66 bronze badges