1 백만 행을 포함하여 거대한 결과 세트가 있습니다. 일반적으로 다음과 같은 코드 조각을 파일에 쓰는 반면, 나는 항상 기억이 안납니다. 이 문제를 제거하는 효과적인 방법이 있습니까?파일에 거대한 행 쓰기
PrintWriter writer = new PrintWriter(filename, "UTF-8");
iteration -> { writer.println(a single string); }
writer.close();
1 백만 행을 포함하여 거대한 결과 세트가 있습니다. 일반적으로 다음과 같은 코드 조각을 파일에 쓰는 반면, 나는 항상 기억이 안납니다. 이 문제를 제거하는 효과적인 방법이 있습니까?파일에 거대한 행 쓰기
PrintWriter writer = new PrintWriter(filename, "UTF-8");
iteration -> { writer.println(a single string); }
writer.close();
ResultSet에 대해 말씀 드렸듯이, 나는 데이터베이스에서 가져옵니다. 먼저 스트리밍 결과 집합을 사용합니다. MySQL의 JDBC 드라이버는 모두 행을 메모리에 버퍼링하고 1M (또는 1B) 행을 버퍼링하는 것이 문제가 될 수 있습니다.
크기를 조정하려면 스레드 방식으로 수행하십시오. 한 스레드 (생성자)가 ResultSet에서 행을 읽고, 다른 하나는 소비자로하여 행을 파일에 기록하십시오. ArrayBlockingQueue와 같은 것이 이것에 아주 좋습니다. 소비자가 생산자를 따라 잡을 수 없으면 차단을 시작하고 소비자가 따라 잡을 때까지 기다리십시오. 이 방법은 IO가 병렬로 처리되기 때문에 메모리가 적게 들고 더 빠릅니다.
PostgreSQL btw에서도 마찬가지입니다. fetchSize를 설정하는 것이 좋습니다. –
버퍼링을 조사하십시오. 그렇게하면 원하는만큼의 메모리를 소비 할 수 있습니다. – dkoch74
인쇄 후 출력기를 플러시하십시오. – QBrute
한 번에 전체 파일을 수행하지 마십시오. 그것을 덩어리로 나누십시오. –