[javascript] 자바 스크립트에서 배열의 최대 크기

컨텍스트 : RSS 피드를 읽고 백그라운드에서 피드를 업데이트 / 확인하는 작은 사이트를 구축하고 있습니다. 표시 할 데이터를 저장할 배열과 표시된 레코드의 ID를 저장하는 배열이 있습니다.

질문 : 일이 느려지거나 느려지기 전에 배열이 Javascript에서 얼마나 많은 항목을 보유 할 수 있습니까? 배열을 정렬하지 않고 jQuery의 inArray 함수를 사용하여 비교를 수행하고 있습니다.

웹 사이트는 계속 실행되고 업데이트되며 브라우저가 자주 다시 시작 / 새로 고침되지 않을 것입니다.

배열에서 일부 레코드를 지우는 것에 대해 생각해야한다면 100 개 항목과 같은 제한 후 일부 레코드를 제거하는 가장 좋은 방법은 무엇입니까?



답변

“느려질”때까지의 최대 길이는 전적으로 대상 컴퓨터와 실제 코드에 따라 달라 지므로 해당 플랫폼에서 어떤 것이 허용되는지 테스트해야합니다.

그러나 ECMA-262 5th Edition 사양에 따른 배열의 최대 길이는 ToUint32 추상 연산 으로 인해 부호없는 32 비트 정수에 의해 제한 되므로 가능한 가장 긴 배열은 2 32 -1 = 4,294,967,295 = 42 억 9 천만 요소를 가질 수 있습니다. .


답변

배열을 트리밍 할 필요가 없으며 단순히 순환 버퍼 (인덱스 % maxlen)로 주소 지정하면됩니다. 이렇게하면 제한을 초과하지 않습니다 (원형 버퍼를 구현하면 일단 끝까지 도달하면 처음으로 다시 감싸고 배열 끝을 오버런 할 수 없음).

예를 들면 :

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");
}


답변

다음과 같이 길이를 테스트하고 다듬을 수 있습니다.

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


답변

@maerics가 말했듯이 대상 컴퓨터와 브라우저가 성능을 결정합니다.

그러나 실제 수치의 경우 2017 년 엔터프라이즈 Chromebook에서 다음 작업을 실행합니다.

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
  • x=5e4 60fps에 충분한 16ms 소요
  • x=4e6 눈에 띄지 만 큰 문제는 아닙니다.
  • x=3e7 1300ms가 소요됩니다.
  • x=4e7 11000ms가 걸리고 추가로 2.5GB의 메모리를 할당합니다.

따라서 자바 스크립트 VM이 4 천만 요소에서 절벽에서 떨어지고 아마도 프로세스가 충돌 할 것이기 때문에 약 3 천만 개의 요소가 엄격한 상한선입니다.


답변

수백만 개의 데이터 세트를 조작하고 그래프로 표시하는 성능 프레임 워크를 구축했으며, 그 후에도 자바 스크립트 계산 대기 시간은 수십 밀리 초였습니다. 어레이 크기 제한을 초과하는 것에 대해 걱정하지 않는 한 걱정할 것이별로 없다고 생각합니다.


답변

매우 브라우저에 따라 다릅니다. 100 개의 항목은 많은 수처럼 들리지 않습니다. 그보다 훨씬 더 많이 갈 수있을 것으로 예상합니다. 수천명이 문제가되지 않아야합니다. 문제가 될 수있는 것은 총 메모리 소비입니다.


답변

나는 뻔뻔하게 메모리에서 꽤 큰 데이터 세트를 가져 왔고, 느려졌지만 데이터 세트에 대한 상당히 강렬한 계산으로 15 개월 정도의 데이터가 필요했습니다. 데이터와 많은 행에 대한 강렬한 계산이 없으면 메모리 문제가 발생하지 않을 것입니다. 다른 모의 결과 세트를 사용한 프로파일 링 및 벤치마킹은 성능을 평가하는 가장 좋은 방법입니다.