>

응용 프로그램으로 2.5GB txt 파일을 읽으려고합니다. Win7 x64를 실행 중이며 43GB의 mem을 사용할 수 있습니다 (64GB 중). 나는 -Xmx -XX : MaxParmSize -XX : ParmSize 등을 가지고 놀았습니다. 이들 중 어느 것도 오류에 영향을 미치지 않습니다. 다른 무엇을 시도 할 수 있습니까? 사용 가능한 힙 공간이 충분하기 때문에이 오류는 매우 이상하게 보입니다.

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at j.utilities.IO.loadString(IO.java:187)
    at j.utilities.IO.loadString(IO.java:169)
    at city.PreProcess.main(PreProcess.java:78)

실행 중

java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

미리 감사합니다.

============== 답변 답변 ==============

좋아, 방금 테스트 했어

StringBuilder sb = new StringBuilder();
for ( int i=1; i<Integer.MAX_VALUE; i++ )
    sb.append("x");

있어

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Unknown Source)
...

따라서 실제로는 Integer.MAX_VALUE보다 큰 배열을 구축하려고하는 것은 StringBuilder입니다.

관심있는 경우

StringBuilder sb = new StringBuilder();
int i=1;
try {
    for ( ; i<Integer.MAX_VALUE; i++ )
        sb.append("x");
} catch ( OutOfMemoryError e ) {
    System.out.println(i); // OUTPUT: 1207959551
    System.out.println(Integer.MAX_VALUE); // OUTPUT: 2147483647
}

StringBuilder를 사용하면 Integer.MAX_VALUE보다 훨씬 적은 1,207,959,550자를 누적 할 수 있습니다.

  • 답변 # 1

    너무 큰 배열을 할당하려고합니다. 매우 긴 문자열을 만들려고하기 때문입니다. 배열은 정수로 색인화되므로 배열은 Integer.MAX_VALUE 이상을 가질 수 없습니다  집단. 힙 크기가 매우 큰 경우에도 Integer.MAX_VALUE 보다 많은 배열을 할당 할 수 없습니다   Integer 를 사용하여 요소를 색인화 할 수 없기 때문에 . Java 배열의 최대 크기는 무엇입니까?를 참조하십시오. 자세한 내용은

  • 답변 # 2

    예를 들어 크기가 다른 새 StringBuilder를 만들 수 있습니다 (예 :

    ).
       StringBuilder sb = new StringBuilder(Integer.MAX_VALUE);
    
    

    문제는 StringBuilder가 배열에서 가질 수있는 것보다 큰 파일을 읽으려고한다는 것입니다. 다음과 같은 몇 가지 옵션이 있습니다 :

    1) 한 번에 전체 파일을 메모리로 읽어야합니까? 그렇다면 여러 StringBuilder로 읽어야합니다.

    2) 파일을 순차적으로 처리합니다.

    3) 압축 된 구조로 읽고 필요할 때 필요한 부분을 압축 해제하십시오.

  • 답변 # 3

    java 명령의 -Xmsn 옵션을 찾아야합니다.

    메모리 할당 풀의 초기 크기를 지정합니다.

    편집 : 이미 완료 한 것을 확인했습니다.

  • 답변 # 4

    문자열 버퍼에 데이터를 보유 할 수 있습니다.  간격을 정의하고 List<String> 를 지우십시오. .

    StringBuffer

  • 이전 c# - ie10 - "현재 보안 설정으로이 파일을 다운로드 할 수 없습니다"팝업이 나타나지 않도록하는 방법은 무엇입니까?
  • 다음 java - 어느 것이 더 빠릅니까? 진술 또는 준비된 진술