2011-08-24 8 views
1

그래서 Amazon S3에서 파일을 다운로드하는 다음과 같은 방법이 있습니다. 현재는 작동하고 있지만 앞으로는 상당히 큰 파일 (2-3 기가 바이트)을 처리해야 할 것으로 예상됩니다. 그렇다면 어떤 성능 최적화를 권하고 싶습니까? 또한 Java에서 파일 I/O에 대한 일반적인 아이디어와 관련된 링크는 제 사례뿐 아니라 일반적으로 많이 도움이 될 것입니다.파일 다운로드 최적화

public static void fetchFileFromS3(String filePath, String outPath) { 
    int size = 5 * 1024 * 1024; //use 5 megabytes buffers 
    byte bufSize[] = new byte[size]; 
    FileOutputStream fout = null; 
    BufferedOutputStream bufOut = null; 
    BufferedInputStream bufIn = null; 
    String[] result = getRealPath(filePath); 
    S3Object object = Utilities.getS3Instance().getObject(new GetObjectRequest(result[0], result[1])); 

    try { 
     fout = new FileOutputStream(outPath); 
     bufOut = new BufferedOutputStream(fout, size); 
     bufIn = new BufferedInputStream(object.getObjectContent(), size); 
     int bytesRead = 0; 
     while((bytesRead = bufIn.read(bufSize)) != -1) { 

      bufOut.write(bufSize, 0, bytesRead); 


     } 

     System.out.println("Finished downloading file"); 

     bufOut.flush(); 
     bufOut.close(); 
     bufIn.close(); 

    } catch (IOException ex) { 
     Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
+0

다운로드 속도 나 디스크 속도가 병목 현상인지 여부를 알 수 있습니까? 많은 경우, 후자는 첫 번째 문제보다 훨씬 덜 중요한 문제이므로 더 많은 대역폭을 확보하는 대신 할 일이별로 없습니다. –

+0

글쎄, 링크가 10GE이고 디스크가 거대한 디스크 배열이기 때문에 둘 다 경합이 없을 때 병목이 아닙니다. 이 경우 코드에 병목 현상이 생기지 않도록 더 궁금해했습니다. – LordDoskias

답변

0

나는 whether they're more efficient in large files에 대한 몇 가지 의견이 비록 새로운 틱 자바 NIO API의 말이으로 찾고 생각합니다.

예를 들어, this question에 대한 답변에서 NIO와 함께 청크 메모리 매핑을 사용하면 트릭을 수행하는 것처럼 보입니다.