Buffered I/O 클래스를 이용한 파일 I/O 시의 효율성 측정

[출처] http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=139547597

 

Question:

1. 주제: Buffered I/O 클래스를 이용한 파일 I/O시의 효율성 측정

2. 내용: 100M 이상의 큰 파일을 DataInputStream으로 읽은 후 DataOutputStream으로 다른 파일로 저장 하였을 경우와 BufferedInputStream으로 읽은 후 BufferedOutputStream으로 다른 파일로 저장 하였을 경우에 대한 시간차이를 구하시오.

3. 조건:

가. Buffered I/O를 사용하였을 경우 Buffer의 크기는 1k, 2k, 4k, 8k로 각각 측정하시오.

나. 반듯이 리눅스 환경에서 프로그래밍을 하여 출력 결과는 핵심부분만 캡쳐 하여 제출하시오.

4. 힌트

– 자바에서 프로그램 실행시간을 구하는 예제

class SystemExample11 {
    public static void main(String args[]) {

        long time1 = System.currentTimeMillis();

        double total = 0.0;

        for (int cnt = 1; cnt < 1000000000; cnt += 2) 
            if (cnt / 2 % 2 == 0)
                total += 1.0 / cnt;
            else
                total -= 1.0 / cnt;

        double pi = total * 4;

        long time2 = System.currentTimeMillis();
        System.out.println("result = " + pi);
        System.out.printf("계산에 %d ms가 소요되었습니다.", time2 - time1);
    }
}

이걸 해야하는데 아무리 해도 모르겠어요 ㅠ

 

Answer:

 

 

100MByte 이상 되는 파일과 500MByte 파일 두가지로 테스트를 진행 했습니다.
실행 환경은 리눅스 환경이 없어 윈도우에서 실행 했습니다. 자바의 특성상 리눅스에서도
소스 그대로 실행 하시면 구동 됩니다.(단지 파일명에만 주의 하십시오)

package com.blogspot.coozplz;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CompareDataNBuffer {

    /**
     * DataInputStream 을 사용하여 파일을 복사한경우. 
     */
    public void useDataInputStream(int bufferSize, File f) throws IOException {
        DataInputStream dis = new DataInputStream(new FileInputStream(f));

        // 출력 파일명은 임의로 설정 했습니다.
        DataOutputStream dos = new DataOutputStream(
                new FileOutputStream("d:/"+System.currentTimeMillis()+".zip"));
        int readSize = 0;
        byte[] buffer = new byte[bufferSize];
        long sTime = System.currentTimeMillis();

        while ((readSize = dis.read(buffer)) > 0) {
            dos.write(buffer, 0, readSize);
        }
        dos.flush();
        System.out.println("DataInputStream["+ bufferSize+"]" 
                +". It takes " + getDuration(sTime) +" ms.");
        dos.close();
        dis.close();
    }

    /**
     * BufferedInputStream 을 사용하여 파일을 복사한경우.
     */
    public void useBufferInputStream(int bufferSize, File f) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
        // 출력 파일명은 임의로 설정 했습니다.
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("d:/"+System.currentTimeMillis()+".zip"));

        int readSize = 0;
        byte[] buffer = new byte[bufferSize];

        long sTime = System.currentTimeMillis();

        while((readSize = bis.read(buffer)) > 0) {
            bos.write(buffer, 0, readSize);
        }
        bos.flush();
        System.out.println("BufferedInputStream["+ bufferSize
                +"]. It takes " + getDuration(sTime) +" ms.");
        bos.close();
        bis.close();
    }

    /**
     * 시간을 측정함.
     */
    public long getDuration(long startTime) {
        return System.currentTimeMillis() - startTime;
    }

    public static void main(String[] args) throws IOException {
        CompareDataNBuffer compareDataNBuffer = new CompareDataNBuffer();
        // 100Mbyte 파일 
        File f100 = new File("d:/dataFile.zip");

        // 500MByte 파일
        File f500 = new File("d:/Tapsonic.zip");


        // 초기 버퍼 사이즈 입니다.
        int size = 1024;
        System.out.println("File Size is "+f100.length());
        for(int i = 1, len=4; i<=len; i++) {
            System.out.println("==> Buffer Size is " + size);
            // DataInputStream을 사용하는 경우 
            compareDataNBuffer.useDataInputStream(size, f100);

            // BufferedInputStream을 사용하는 경우
            compareDataNBuffer.useBufferInputStream(size, f100);
            System.out.println();
            size = size*2;
        }
        size = 1024;
        System.out.println("File Size is "+f500.length());
        for(int i = 1, len=4; i<=len; i++) {
            System.out.println("==> Buffer Size is " + size);
            // DataInputStream을 사용하는 경우 
            compareDataNBuffer.useDataInputStream(size, f500);
            // BufferedInputStream을 사용하는 경우
            compareDataNBuffer.useBufferInputStream(size, f500);
            System.out.println();
            size = size*2;
        }
    }

}

[출력결과]

File Size is 114482881
==> Buffer Size is 1024
DataInputStream[1024]. It takes 1060 ms.
BufferedInputStream[1024]. It takes 375 ms.

==> Buffer Size is 2048
DataInputStream[2048]. It takes 692 ms.
BufferedInputStream[2048]. It takes 374 ms.

==> Buffer Size is 4096
DataInputStream[4096]. It takes 1263 ms.
BufferedInputStream[4096]. It takes 1208 ms.

==> Buffer Size is 8192
DataInputStream[8192]. It takes 1997 ms.
BufferedInputStream[8192]. It takes 1923 ms.

File Size is 577189779
==> Buffer Size is 1024
DataInputStream[1024]. It takes 17725 ms.
BufferedInputStream[1024]. It takes 6152 ms.

==> Buffer Size is 2048
DataInputStream[2048]. It takes 26353 ms.
BufferedInputStream[2048]. It takes 6864 ms.

==> Buffer Size is 4096
DataInputStream[4096]. It takes 16938 ms.
BufferedInputStream[4096]. It takes 8632 ms.

==> Buffer Size is 8192
DataInputStream[8192]. It takes 11091 ms.
BufferedInputStream[8192]. It takes 9306 ms.


 

 

이 글은 java 카테고리에 분류되었고 태그가 있으며 님에 의해 에 작성되었습니다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중