문제

힙의 용량을 제쳐두고, Java의 Integer.max_value 제약 조건을 넘어 갈 수있는 방법이 있습니까?

예는 다음과 같습니다.

  1. 컬렉션은 정수로 제한됩니다 .max_value.
  2. StringBuilder / StringBuffer는 자신을 Integer.max_value로 제한합니다.
도움이 되었습니까?

해결책

당신이 거대한 컬렉션이 있다면 당신은 당신이 갖기 전에 모든 종류의 실용적인 한계에 부딪 칠 것입니다. 231 - 1 그 안에 항목. 백만 가지 품목이있는 컬렉션은 그보다 수천 배 이상인 사람은 물론 꽤 다루기 어려울 것입니다.

마찬가지로 StringBuilder는 크기가 2GB 인 문자열을 만들 수 있습니다. MAX_VALUE 실용적인 목적에 적합한 한계.

이 제한을 충족 할 수 있다고 생각하면 응용 프로그램은 데이터베이스에 데이터를 다른 방식으로 저장해야합니다.

다른 팁

길고? 나를 위해 일합니다.

편집하다: 아, 질문의 설명. 시원한. 새롭고 개선 된 답변 :

페이징 알고리즘.

우연히도, 최근 다른 질문에 대해 다소 (Java의 정렬 된 (메모리 매핑?) 파일의 이진 검색), 나는 페이징 알고리즘을 휘젓기 위해 int java.nio.mappedBytebuffer API의 매개 변수.

해당 컬렉션의 소스 코드를 기반으로 긴 크기 ()가있는 고유 한 컬렉션을 만들 수 있습니다. 예를 들어 더 큰 객체 배열을 갖기 위해 배열 배열을 가질 수 있습니다 (및 함께 스티치).

이 접근법은 거의 2^62 요소를 허용합니다.

정렬 인덱스 배열의 물리적 크기가 아니라 integer.max_value로 제한됩니다.

따라서 배열의 최대 크기는 배열 유형의 크기에 연결됩니다.

byte = 1 byte => max  2 Gb data
char = 2 byte => max  4 Gb data
int  = 4 byte => max  8 Gb data
long = 8 byte => max 16 Gb data

사전은 버킷이나 내부 데이터 레이아웃과 같은 기술을 종종 트리로 사용하기 때문에 다른 이야기입니다. 따라서 이러한 "제한"은 일반적으로 적용되지 않거나 한도에 도달하려면 더 많은 데이터가 필요합니다.

짧은 : integer.max_value는 실제로 한계에 도달하기 위해 많은 메모리가 필요하기 때문에 실제로 한계가 아닙니다. 이 한계에 도달 해야하는 경우 알고리즘 및/또는 데이터 레이어 개선에 대해 생각할 수 있습니다 :)

예, BigInteger 클래스와 함께.

메모리 업그레이드가 필요합니다 .. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top