2017-11-14 11 views
0

DB에서 큰 파일 텍스트를 작성하려고합니다. 2 밀론 줄 정도입니다. PrintWriter가 선 (println())을 인쇄하는 동안 파일 크기는 항상 0 바이트임을 관찰했습니다. 파일은 스트림이 닫힌 후에 크기 데이터를가집니다. 모든 데이터가 메모리에 먼저 저장되고 스트림이 닫힐 때 해제됩니다. 내 경우에는 1 밀론의 데이터 + - 2.5GB의 메모리가 소모되었습니다. 앱 충돌. 실시간으로 데이터를 쓰고 메모리 소비를 방지 할 수 있습니까?Java PrintWriter 대용량 메모리 사용

File file = new File("file.txt"); 

    PrintWriter out; 

    out = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), "UTF-8")); 

for (int i=0; i < 9999999; i++){ 
    out.println("some data here"); 
} 
out.close(); 
+0

https://stackoverflow.com/questions/7753424/whats-the-most-efficient-way-to-write-large-text-file-in-java를 확인 했습니까? –

+0

왜 PrintWriter 작성이 복잡합니까? 새로운 PrintWriter ("file.txt")를 사용할 수 있습니다. 그리고 귀하의 질문에 대답하기 위해 flush()를 'n'행마다 사용해보십시오. – Tharun

답변

1

flush() 또는 close()를 호출 할 때까지 내용을 버퍼링 할 수 있도록 당신은 행의 자동 플래시는 실시하지 않고 PrintWriter 만들었습니다

이 A A 예이다. 당신이 (가 느린) 모든 라인을 세척하지 않기 때문에, 당신은

for (int i=0; i < 9999999; i++){ 
    out.println("some data here"); 
    if(i % N == 0) 
     out.flush(); 
} 

와 플러시마다 N 라인을 수행하는 방법의 성능 변화를 볼 수 N의 다른 값으로 그것을 밖으로 시도 할 수 있습니다.

+0

안녕하세요 Kayaman, out.flush()를 사용해 보았지만 나에게 도움이되지 않았습니다. 그리고 생성자를 사용하여 자동 플러싱을 사용하려고했습니다. out = new PrintWriter (new OutputStreamWriter (new BufferedOutputStream (new FileOutputStream (file)), "UTF-8"), true); – toto

+0

"작동하지 않는다"는 것은 무엇을 의미합니까? 데이터가 플러시됨에 따라 파일 크기가 커지는 것을 볼 수 있습니다. – Kayaman

+0

파일 크기는 항상 0 바이트이며 메모리는 최대 2.5GB입니다. out.close()가 실행될 때만 데이터 크기를가집니다. – toto