2012-02-23 6 views
2

&을 읽으려면 압축 된 텍스트 파일에서 많은 양의 문자열 (각 줄 길이 90 자 길이)을 작성해야합니다. 이
입력/출력을 준비하는 작업 소요 시간도이지만 무시 될 수있다 (IO 시간이 훨씬 더 크다 (프로파일))입출력 성능과 속도 향상

이 내가 사용하고있는 코드는 다음과 같습니다

GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(file)); 
out.write((stringData+NewLineConstant).getBytes()); 

GZIPInputStream in = new GZIPInputStream(new FileInputStream(file)); 
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in),8192); 
String data = bufferedReader.readLine(); 

문제는 완료하는 데 너무 많은 시간이 걸립니다.

이 작업은 데이터를 정렬하는 데 사용되는 여러 파일 (병합 정렬)에도 적용됩니다.

극적으로 성능을 향상시키기 위해 할 수있는 일이 있습니까? (하드웨어 변경없이)

+1

이 코드를 올바르게 읽으면 파일에 쓰고 * 동일한 * 파일을 다시 읽는 중입니까? 아니면 내가 틀렸어? – ArjunShankar

+1

아! 당신은 중간에 정렬합니다. 코드의 더 큰 부분을 공유 할 수 있을까요? 속도 향상 기회를 '폭로'할 수 있습니다. – ArjunShankar

+1

얼마나 빨리 필요합니까? – DNA

답변

2

해당 행의 첫 번째 또는 두 개의 문자 배포에 대한 정보가 있습니까?

그렇다면이 큰 파일을 한 번 읽을 수 있으며 해당 줄의 첫 번째 또는 두 번째 문자 만 기반으로 한두 개의 버킷 (파일)을 만들 수 있습니다. 그 후에 배포본이 균일하면 버킷을 메모리에 분류 할 수 있습니다 (해당 파일은 1GB보다 작을 것입니다).

구체적으로 그 결과는 다음과 같습니다

  • 라인의 각 유형 (쓰기 1 큰 파일 (10기가바이트) 버킷 파일의
  • 개방 수십여 : AA, AB, ...)
  • 이 큰 파일의 라인을 읽고, 버킷에 기록하는 것은
  • 는 버킷
  • 종류의 메모리에 버킷 파일을 파일을 닫습니다 큰 파일을 닫습니다 파일 (먼저 AA는, AB, ...보다) 8K에서 256K에 (,이 병렬 처리 될 수있다, 당신은 (일부 메가 바이트 8K에서) 읽기 버퍼를 증가시켜야 일반적으로 그들에게

를 추가하고 쓰기 버퍼 -512K).