2017-10-18 5 views
0

파일에 한 번에 64000 개의 레코드 주위에 거대한 데이터를 쓰려고합니다. 나는 벨로우즈에 첨부 된 예외를 얻고있다. enter image description here파일에 쓰는 동안 Java 힙 공간 오류가 발생했습니다.

내가 작성하는 데 사용되는 코드는 여기에

Path outputpath = Paths.get("file1.json"); 
try (BufferedWriter writer = Files.newBufferedWriter(outputpath, StandardCharsets.UTF_8, WRITE)) { 
writer.write(jsonObject.toString()); 
} catch (Exception e) { 
//error msg 
} 

내 "된 JSONObject는"65000 행이 포함 된 JSON 배열에 불과하다.

힙 공간 오류를 피할 수 있도록 효율적인 방식으로이 파일을 작성하는 데 도움을 주시기 바랍니다.

+0

JSON의 메모리 내 표시를 작성하지 말고 'writer'로 스트리밍하십시오. –

+0

그 해결책으로 시도해 볼 수 있습니다 : https://stackoverflow.com/questions/1062113/fastest-way-to-write-huge-data-in-text-file-java –

+0

시작할 때 JVM에 더 많은 메모리를 제공하십시오 -Xmx 명령 행 옵션을보십시오. 또는 MleRutte가 제안한 것처럼 스트리밍 해 봅니다. –

답변

-1

당신은 JSON 객체를 통해 iterate에 시도 할 수 있습니다 :

Iterator<String> keys = (Iterator<String>) jsonObject.keys(); 
while (keys.hasNext()) { 
    String key = keys.next(); 
    JSONObject value = jsonObject.getJSONObject(key); 
    writer.write(value.toString()); 
} 

PS합니다. json 객체의 구조를 확인해야합니다.

1

스택 트레이스를 조금 줄 였지만 jsonObject.toString()에서 예외가 발생한다고 가정합니다.

기본적으로 두 가지 중에서 선택해야합니다. 더 많은 메모리를 할당하거나 큰 작업을 여러 개의 작은 작업으로 나누십시오. 메모리를 추가하는 것은 빠르고 간단합니다. 그러나 앞으로 더 많은 데이터가 필요하다면 영원히 문제를 해결할 수 없습니다. 다른 사람들이 언급했듯이, Java 커맨드 라인에서 -Xmx 또는 -Xms를 사용하십시오.

다음으로 시도 할 수있는 것은 다른 JSON 라이브러리를 사용하는 것입니다. 아마도 지금 사용하고있는 것은 큰 JSON 객체에는 적합하지 않을 것입니다. 또는 최신 버전이있을 수 있습니다.

마지막 수단으로 언제든지 JSON을 직접 만들 수 있습니다. 그것은 결국 문자열이고, 이미 메모리에 데이터가 있습니다. 가능한 한 효율적이기 위해서는 한 번에 전체 문자열을 작성할 필요조차 없습니다. BufferedWriter에 비트와 조각을 쓸 수 있습니다.

관련 문제