반응형
어느날 업무를 보던중에 운영중인 서버에서 특정 컨텐츠에 대한 물리적 파일(사진, 영상 등등)을 한꺼번에 이관해야 할 일이 있었다.
전체 컨텐츠의 사이즈가 꽤 컸기때문에 어떻게 할까 하다가, DB에서 백업해야할 특정 컨텐츠들의 정보를 쿼리로 뽑아낸 후
해당 컨텐츠의 파일들을 한쪽으로 복사한뒤 FTP로 내려받기로 결정하였다.
그래서 간단하게 파일 복사할 클래스를 만들었고, 파일 복사방법은 아무 생각없이 아래와 같이 작성하였다.
FileInputStream fis = new FileInputStream(원본파일); FileOutputStream fos = new FileOutputStream(복사파일); int data = 0; while((data=fis.read())!=-1) { fos.write(data); } fis.close(); fos.close();
전체 복사해야 할 파일은 4만건 정도에 20GB에 육박했다. 프로그램을 돌려보니 파일 복사 속도가 느리다.
개별 복사 속도는 빨랐으나 파일 건수가 많다보니 전체적인 퍼포먼스가 떨어졌다.
고심끝에 구글링을 통해 FileChannel을 이용하면 더 빠른 복사가 가능하다는 사실을 알았다.
그래서 코드를 다음과 같이 바꿨다.
FileInputStream inputStream = new FileInputStream(원본파일); FileOutputStream outputStream = new FileOutputStream(복사파일); FileChannel fcin = inputStream.getChannel(); FileChannel fcout = outputStream.getChannel(); long size = fcin.size(); fcin.transferTo(0, size, fcout); fcout.close(); fcin.close(); outputStream.close(); inputStream.close();
코드를 변경하였더니 복사 속도는 2배이상 빨라졌다.
정확한 시간을 측정하지는 않았지만 파일 복사되는 로그가 올라가는것을 보면 2배는 더 빨라진게 확실했다.
흠. 이 녀석에 대해서는 공부가 좀 필요할듯 .
'Language > Java / JSP' 카테고리의 다른 글
[Java] 커맨드창에서 사용자 입력값 받기 (1) | 2014.09.24 |
---|---|
[JSP] 정적, 동적 include (0) | 2014.09.18 |
[Java] 간단한 숫자체크 (0) | 2014.09.15 |
[Java] 아스키 코드(ASCII)를 활용한 알파벳 자동증가(A ~ z) (0) | 2014.09.12 |
[Java] Base64 암호화, 복호화 방법 (2) | 2014.09.08 |