문제

인사, 나는 데이터베이스에서 수많은 레코드를 얻고 파일에 씁니다. 거대한 파일을 작성하는 가장 좋은 방법이 무엇인지 궁금했습니다. (1GB -10GB).

현재 BufferedWriter를 사용하고 있습니다

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();
도움이 되었습니까?

해결책

당신이 이것을 위해 Java를 실제로 사용한다고 주장한다면, 가장 좋은 방법은 글을 쓰는 것입니다. 즉시 데이터가 등장하자마자 수집하지 않으려면 모두 데이터의 데이터 ResultSet Java의 기억에 먼저. Java에서는 적어도 많은 무료 메모리가 필요합니다.

따라서 예를 들어

while (resultSet.next()) {
    writer.write(resultSet.getString("columnname"));
    // ...
}

즉, 대부분의 괜찮은 DB의 선박은 Java에서 할 수있는 것보다 의심 할 여지없이 더 효율적입니다. 당신은 당신이 어떤 것을 사용하고 있는지 언급하지 않았지만, 예를 들어 MySQL이면 LOAD DATA INFILE 이것을 위해. DB 관련 문서를 참조하십시오. 이것이 새로운 통찰력을주기를 바랍니다.

다른 팁

버퍼링 라이터의 기본 버퍼 크기는 8192입니다. Squigabyte 파일을 작성하려는 경우 2 개의 인수 생성자를 사용하여이를 늘릴 수 있습니다. 예를 들어

int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);

이렇게하면 파일을 작성하는 데 필요한 SyScall의 수가 줄어 듭니다.

그러나 나는 이것이 몇 % 이상의 차이를 만들 것이라고 의심합니다. 결과 세트에서 행을 당기는 것이 아마도 주요 성능 병목 현상 일 것입니다. 성능이 크게 향상되면 데이터베이스의 기본 대량 수출 시설을 사용해야합니다.

100% 확실하지는 않지만 완충 리더가 RAM의 버퍼에 데이터를로드하는 것으로 보입니다. Java는 128MB RAM을 사용할 수 있으므로 (달리 지정되지 않는 한) BufferedReader는 Java의 메모리가 오류를 일으킬 수 있습니다. InputStreamReader 및 FileInputStream을 사용하여 데이터를 Char에 저장 한 다음 파일 아웃 PutStream을 사용하여 해당 Char를 작성하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top