Java의 Integer.max_value 제약 조건을 넘어서십시오
-
21-08-2019 - |
문제
힙의 용량을 제쳐두고, Java의 Integer.max_value 제약 조건을 넘어 갈 수있는 방법이 있습니까?
예는 다음과 같습니다.
- 컬렉션은 정수로 제한됩니다 .max_value.
- 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 클래스와 함께.
메모리 업그레이드가 필요합니다 .. :)