2014-09-20 5 views
1

하드 드라이브의 벤치마킹을 시도하고 있습니다. 이는 대기 시간 (ms)과 처리량 (MB/s)을 계산하는 것입니다. 그렇게하기 위해 파이썬 함수 f.write의 실행 시간을 측정하고 싶습니다. 내가 필요한 것은 정확하게 x 바이트를 내 파일에 쓰는 것이다. 은 내가 사용하여 내 파일을 열 필요가 있음을 이해Python - Benchmarking Disk - 정확히 x 바이트를 파일에 작성하십시오.

f = open(file_name, 'wb') 

그럼 내가 뭘

for i in range(blocksize) 
    f.write(b'\xff') 

Howewer는, 내가 처리량 (MB/s의)에 대한 취득 결과가 너무 낮습니다. 대기 시간이 올바른 것처럼 보입니다. 그래서 내가 추론 한 것은 이전 라인을 할 때 실제로 파일에 1 바이트 이상을 쓰고 있는데, 1 바이트를 포함하는 문자열을 쓰고 있습니다 ... 그 객체는 실제로 파이썬에서 크기가 없다는 것을 알고 있습니다. 하지만이 문제를 해결할 수있는 방법이 있습니까?

편집 여기에 새로운 코드가 있습니다. 이제 결과가 알기 쉽지 않게 너무 높아졌습니다! 내 디스크의 쓰기 제한은 100MB/s 여야하지만 결과는 10 배 빠릅니다. 뭐가 문제 야 ? 수입 SYS

f = open("test.txt",'wb+') 

def file_write_seq_access(blocksize): 
    chunk = b'\xff'*4000 
    for i in range(blocksize//4000): 
     f.write(chunk) 

if __name__ == '__main__': 
    start_time = time.time() 
    file_write_seq_access(int(sys.argv[1])) 
    stop_time = time.time() 
    diff = stop_time - start_time 
    print diff, "s" 
    print (int(sys.argv[1])/diff),"B/s" 

답변

3

간단히 말하자면 수입 시간, 파이썬은 바이트 단위 서면의 종류, 파일 버퍼링 빠른 것만으로는 충분하지 않습니다 유사한 너무 많은 오버 헤드를 추가합니다.

당신이 할 일은 덩어리가 작업입니다 :

import sys 

blocksize = int(sys.argv[1]) 

chunk = b'\xff'*10000 
with open("file.file", "wb") as f: 
    for _ in range(blocksize // 10000): 
     f.write(chunk) 

아마도 추가 (매우 소형, 아마도 부정적인) 속도 향상을 제공한다 PyPy를 사용하여.

OS가 여기에 타이밍을 방해하므로 의 차이가 있음을 유의하십시오. C를 사용하면 더 빨리 끝날 수 있습니다.


약간의 타이밍을 수행 한 후,이 속도 dd 일치하는, 그래서 당신은 빨리 점점 않을거야.

+1

무엇을 당신의 타이밍으로 했습니까? time.time()? –

+1

알고있는 한, 척의 크기를 파일 시스템 블록 크기와 같게 할 수 있습니다. 얼마나 큰지 잘 모르겠다면 4kb는 종종 좋은 추측입니다. – Blckknght

+1

나는 VM에서 리눅스를 돌리고 있는데, 파일 시스템 블록 크기는 윈도우 중 하나인가 아니면 리눅스 중 하나인가? VM을 실행하면 제 타이밍의 정확성에 부작용이있을 수 있다고 생각합니까? –

2

결과를 잘 작성하려면 호출 시간 오버 헤드를 최소화하고 버퍼를 플러시하는 데 저수준 I/O를 사용해야합니다. 그렇지 않으면 쓰기가 어딘가에서 버퍼링 될 수 있습니다 (예 : OS를 사용하는 경우).

from time import perf_counter as time 

def write_test(file, block_size, blocks_count): 
    f = os.open(file, os.O_CREAT|os.O_WRONLY, 0o777) # low-level I/O 

    took = [] 
    for i in range(blocks_count): 
     buff = os.urandom(block_size) # get random bytes 
     start = time() 
     os.write(f, buff) 
     os.fsync(f) # force write to disk 
     t = time() - start 
     took.append(t) 

    os.close(f) 
    return took 

이 코드는 내 취미 프로젝트의 일부입니다.이 코드는 파이썬에서 HDD 및 SSD를 벤치 마크하는 간단한 도구입니다. 완전히 오픈 소스이며 현재는 알파 단계입니다. 이미 사용하고 있지만 관심이 있다면 개발에 참여할 수 있습니다. 희망 좋은 아이디어를 찾을 수도, 아니면 당신을 제공하기를 바랍니다. 여기에 링크가 있습니다 : https://github.com/thodnev/MonkeyTest

+0

왜 downvote? –