2010-07-26 5 views
4

나는 큰 파일 전송 (예 : 4GB 정도)을 가지고 있으며 shutil을 사용하는 대신 정상적인 파일 방식으로 열기 및 쓰기 만하므로 진행률을 이동할 수 있습니다 을 따라서.파이썬에서 큰 파일 쓰기 다시 시작

그런 다음 파일 쓰기를 다시 시도하려고 시도했습니다. 어떤 이유로 든 프로세스 중에 골치 아픈 경우입니다. 나는 어떤 운도 가지지 않고 있었다. 나는 소스 파일의 읽기를 상쇄하고 탐색을 사용하는 것이 영리한 조합이라고 생각하지만 지금까지 행운이 없다. 어떤 아이디어?

또한 파일을 읽고 쓸 때 사용할 블록 크기를 결정하는 데 일종의 동적 방법이 있습니까? 나는 그 지역에 꽤 초보자이고, 더 큰 파일을 위해 더 큰 크기를 사용하기 위해 읽었다 (나는 지금 65536를 사용하고있다). 그것을 할 수있는 현명한 방법이 있습니까? 아니면 간단히 추측합니까? 고마워. 여기

은 첨부 된 파일 전송의 코드입니다 :

   newsrc = open(src, 'rb') 
       dest_size = os.stat(destFile).st_size 
       print 'Dest file exists, resuming at block %s' % dest_size 
       newsrc.seek(dest_size) 
       newdest = open(destFile, 'a') 
       cur_block_pos = dest_size 
       # Start copying file 
       while True: 
        cur_block = newsrc.read(131072)      
        cur_block_pos += 131072 
        if not cur_block: 
         break 
        else: 
         newdest.write(cur_block) 

그것은 추가하고 쓰기 시작 않지만,이 것보다 그 다음에 아마 분명한 이유 끝에 dest_size 더 많은 데이터를 기록 나머지는. 어떤 아이디어?

+0

파일 전송에는 어떤 문제가 있습니까? –

+1

파일에 추가하려고 시도해 주시겠습니까? 당신은 계속해서 글을 찾고 계속할 수 있어야합니다. 파일 모드 "a"를 사용하여 여는 중입니까? –

+0

파일 전송에 문제가 발생하지 않았습니다. 그러나 네트워크상에서 6 + gb만큼 큰 파일을 이동시키는이 코드를 개발하면 새로운 변경 사항을 관찰하고 큰 파일 전송에서 중단 된 부분을 파악할 수 있도록 시작하는 것이 좋습니다. 나는 op에 코드를 추가했다. – Cryptite

답변

1

질문의 두 번째 부분에서 데이터는 일반적으로 512 바이트 단위로 하드 드라이브에서 읽고 쓰여집니다. 그래서 그것의 배수 인 블록 크기를 사용하면 가장 효율적인 전송을 제공해야합니다. 그것 이외에는별로 중요하지 않습니다. 지정한 블록 크기는 I/O 연산이 주어진 시간에 메모리에 저장하는 데이터의 양이므로, 많은 RAM을 사용하기 위해 너무 큰 것을 선택하지 마십시오. 나는 8K (8192)가 일반적인 선택이지만 64K는 괜찮을 것이라고 생각한다. (최상의 블록 크기를 선택할 때 전송되는 파일의 크기가 중요하지 않다고 생각합니다.)

+0

일반적으로 사이에 운영 체제에 의해 버퍼링 레이어가 있으므로, * 512 * 배수가 아닌 무언가를 사용하더라도 모든 것이 그렇게 중요하지는 않습니다. 그러나 다른 블록 크기를 시험해 보는 것은 사소한 일입니다. 확신하고 싶다면 직접 벤치마킹하십시오! – Wim