2010-10-27 2 views
6

큰 InputStream 읽고 문자열로 반환합니다. 이 InputStream은 큰 것입니다. 그래서, 일반적으로 그것은 excuting하는 동안 많은 시간과 많은 메모리를 필요로합니다. 다음 코드는 지금까지 개발 한 코드입니다. 이 코드는 시간이 오래 걸리는 적은 메모리로 작업을 수행하므로 변환해야합니다.Java에서 큰 InputStream을 읽는 성능 튜닝

저에게 알려주세요.

BufferedReader br = 
    new BufferedReader(
     new InputStreamReader(
      connection.getInputStream(), 
      "UTF-8") 
     ); 

StringBuilder response = new StringBuilder(1000); 

char[] buffer = new char[4096]; 

int n = 0; 
while(n >= 0){ 
    n = br.read(buffer, 0, buffer.length); 
    if(n > 0){ 
     response.append(buffer, 0, n); 
    } 
} 
return response.toString(); 

고마워요!

+2

메모리의 "많은"무엇입니까? 당신이 만들고있는 문자열 전체를 유지할만큼 충분한 메모리가 필요합니다. 기대했던 것보다 극적으로 더 나쁜 것을보고 있습니까? – djna

+0

당신은 무엇을 읽고 계십니까? – dogbane

+0

예. 소비 된 메모리가 응답 (String)의 크기에 비례한다는 것은 사실입니다. 하지만 여기에서는 메모리를 효과적으로 사용하려고합니다 (불필요한 메모리 사용량 감소 등). 여기의 예제에서는 불필요한 메모리 사용을 줄이기 위해 + 문자열 (str = str + newStr)을 사용하여 동일한 문자열에 입력을 추가하는 대신 StringBuilder를 사용했습니다. 이와 같이, 나는 메모리를 관리하고 코드를 빠르게함으로써 내 코드를 훨씬 더 잘 보이게하는 더 많은 아이디어를 기대했다. – Namalak

답변

3

버퍼링 된 I/O를 수행 할 때 버퍼링 된 판독기에서 한 번에 하나의 char 만 읽을 수 있습니다. 그런 다음 문자열을 빌드하고 끝에 toString()을 수행하십시오.

+0

문자를 char 배열에 저장하는 것이 각 문자를 읽는 것보다 낫고 문자열을 빌드하는 것이 더 낫습니다. read() read() Vs read (char [], int start, int end) – Namalak

+1

버퍼링 된 리더가 커버 아래에서하는 일입니다. BufferedReader의 소스를 살펴 봅니다. –

1

일부 운영 체제의 대용량 파일의 경우 FileChannel.map을 통해 파일을 mmap으로 보내면 성능을 향상시킬 수 있습니다. 파일을 매핑 한 다음 매핑 된 ByteBuffer에서 문자열을 만듭니다. 벤치마킹해야하지만, '전통적인'IO가 경우에 따라 더 빠를 수도 있습니다.

+0

OP가 파일이 아닌 URL을 읽고 있습니다. – dogbane

+0

예. 나는이 FileChannel.map을 처음 사용합니다. URL을 읽는 OP와 함께 사용할 수 있습니까? – Namalak

+0

@dogbane 및 Namalak : 내가 대답을 떠날 때까지 명확하지 않은 것이 공평합니다. 나중에 누군가가 따라오고 싶을 때를 대비하여 여기에 남겨 둘 것입니다. 파일과 동일합니다. –

0

문자열의 가능한 최대 길이를 미리 알고 있습니까? 현재 버퍼에 대해 1000의 용량을 지정합니다. 만약 당신이 읽는 것이 그보다 더 크다면 더 큰 내부 버퍼를 할당하는데 약간의 비용을 지불하게 될 것입니다.

읽고있는 내용의 수명주기를 제어 할 수 있다면 버퍼로 사용할 수있는 단일 바이트 배열을 할당 할 수 있습니다. 따라서 가비지 수집을 피하십시오.

0

버퍼 크기를 늘리십시오. 버퍼가 클수록 모든 데이터를 더 빨리 읽을 수 있습니다. 스트림에서 사용할 수있는 바이트 수를 알면 (또는 해결할 수있는 경우) 동일한 크기의 버퍼를 미리 할당 할 수도 있습니다.

+0

감사합니다. 1000 지금까지 좋은 것입니다. 버퍼 크기가 불필요하게 증가하면 비효율적입니다. – Namalak

+0

내가 4096으로 설정 한 char 버퍼를 의미합니다. – dogbane

0

별도의 스레드에서 코드를 실행할 수 있지만 더 빨리 실행되지는 않지만 적어도 프로그램에서 스트림의 데이터를 기다리는 대신 다른 작업을 수행 할 수 있습니다.

+0

그러나 병렬 실행 가능한 작업은 없습니다. – Namalak