티스토리 뷰

그냥 의미없는 일정 크기의 file 을 만들어야 할 일이 생겨서 간만에 python 을 가지고 놀아봤다.
version : python 2.5

근데 하다 보니 재밌는 모습이 보였다.
일단 file 을 일정크기로 만드는 작업이었기 때문에 file I/O 가 들어갔는데,
이때 순수하게 file I/O 만으로 1byte 씩 찍는 작업을 했더니 조금 오래 걸렸다.
그래서 어느정도 일정량의 buffer 를 잡고 file I/O 를 했더니 속도가 빨라졌다.

어느 정도의 크기의 buffer 가 좋을지를 측정해 보고자 아래 같은 code를 사용했다.
물론 string 을 만드는 작업에 대한 load 때문에 차이가 생길지도 모르겠다. 확실히 너무 큰 string 을 만들어서 file write 를 할때는 string 의 부하가 훨씬 컸다. 하지만 신기하게도 file write 의 부하도 같이 커졌다.
확실히는 모르지만 write() 내부에도 buffer 가 존재하지 않을까 싶다.(확인이 필요하다.)

여하튼 아래 상황에서 가장 괜찮은 속도를 가져다 준 것은 10,000 byte 정도의 string 을 만들어 사용했을 때였다.

#/usr/bin/env python
# -*- coding: mbcs -*-

"""
This app. is for making a specific size of file chunk.
"""

import sys
import time
import random


def main(argv=None) :

    if argv is None:
        argv = sys.argv
        argc = len(argv)

    size = 10000000;# 10MB
    makeChunk(size);

def makeChunk(size):
    filename = "chunk" + str(random.randint(0,100)) + '.chk';
    try:
        wf = open(filename , "wb");
    except IOError:
        print 'IOError';
        if wf is not None:
            wf.close();
    else:
        MEMMAX = 10000; # byte
        if size >= MEMMAX:
            strsize = MEMMAX;
        else:
            strsize = size;

        t1 = time.time();
        emptystr = ''.join([`num`[0] for num in xrange(0, strsize)]);
        t2 = time.time();
        end = size / strsize;
        for i in xrange(0, end):
            wf.write(emptystr);
        t3 = time.time();
        print 'total time', t3-t1;
        print 'string make time', t2-t1;
        print 'file write time', t3-t2;
        wf.close();
    
if __name__ == '__main__' :
    main()



댓글