2012-03-22 1 views
-1

나는이 단어 파일에 단어 목록과 각 단어와 관련된 점수 목록이 들어 있습니다. 파일과 단어의 단어를 읽고 프로젝트에서 사용하고 싶습니다. 이 코드는 Java로 작성되었으며 파일 자체는 약 13MB입니다. 파일을 읽으려고 할 때 완료되는 데 약 15 분이 걸리지 만 언젠가는 더 오래 걸립니다. 이 문제를 어떻게 최적화하거나 처음부터 접근해야하는지에 대한 아이디어.주 메모리에 파일로드

작업은 파일에서 수행되고있다 - 1. 읽기 각 행 (평균 경우 10 토큰의 주위에) 하나의 공백을 사용하여 토큰에 2. 분할 3. 저장소 (평균 경우 50 개 문자 정도) 배열의 생성 된 토큰 (이 단계에서는 더 이상 없음)

편집 : 전에 내 코드를 게시하지 않아서 죄송합니다. http://pastie.org/3646388 EOF까지 루핑하는 것과는 대조적으로 출력을 얻었는지 10000 값으로 루프하는 곳이 있습니다.

+1

코드를 공유 할 수 있습니까? 가능한 몇 가지 최적화가있을 수 있습니다. –

+0

오래 걸리면 코모로 64에서 실행 중이거나 코드에 문제가있는 것입니다. 우리는 볼 수 없습니다. –

+0

예, 앞서 언급했듯이 더 많은 코드가 도움이되지만 요즘 PC에서도 13MB 파일을 읽는 데 15 분이면 매우 느립니다. 파일 조작이 병목 현상이라고 생각하지 않습니다. 내 제안 : 1. 토큰을 분할하는 2 단계가 예상보다 많은 CPU를 사용한다면? 그렇다면 코드를 최적화하십시오. 2, 3 단계에서 많은 메모리 할당 작업이 필요하면 처음에는 Array (또는 ArrayList?)에 충분한 크기의 배열을 할당하고 JVM을 더 큰 시작 힙을 갖도록 조정합니다. –

답변

1

코드 샘플을 게시해야합니다. 그렇지 않으면 추측하고 있습니다. 그러나 java.io 클래스 (InputStream 또는 Reader)를 사용하는 경우 InputStream 또는 Reader를 BufferedInputStream 또는 BufferedReader로 래핑하는지 확인하십시오. BufferedReader의 JavaDoc에서

new BufferedReader(new InputStreamReader(new FileInputStream("/path/to/file"))); 

: 텍스트를 읽는 때문에

, 당신의 독자를 구성하는 코드가 같은 것을 보일 수 있습니다 일반적으로

, 각각 리더로 만들어진 요청을 읽고 기본 문자 또는 바이트 스트림에 대해 해당 읽기 요청을 수행합니다. 따라서 은 FileReaders 및 InputStreamReaders와 같이 read() 작업에 많은 비용이 드는 Reader 주위에 BufferedReader를 래핑하는 것이 좋습니다.

코드 프로파일 링을 고려해야합니다. 프로파일 러가 필요하지 않은 경우 JVisualVM을 사용해보십시오. 그것은 JDK와 함께 제공됩니다.

+0

'FileInputStream'을'BufferedInputStream'으로 랩핑하면 더 잘 작동합니다.더블 버퍼링이 도움이된다는 것은 이상하게 보입니다. 그러나 적어도 (적어도 많은 시스템에서는) 그렇게합니다. –

+0

FileInputStream에는 버퍼링이 없습니다. –

+0

@TedHopp는 inputstream을 사용하여 @TedHopp가 뒤틀리는 것을 의미한다고 생각합니다. –