2010-07-26 54 views
4

我有一個很大的文件傳輸(比如說4GB左右),而不是使用shutil,我只是打開並以普通文件的方式寫入,所以我可以在移動時包含進度百分比沿。恢復一個大文件在Python中寫入

然後,我想到嘗試恢復文件寫入,如果由於某種原因它在這個過程中停止了。雖然我沒有任何運氣。我推測這將是一些巧妙的組合,抵消源文件的讀取和使用搜索,但是迄今爲止我還沒有任何運氣。有任何想法嗎?

此外,是否有某種動態的方式來確定讀取和寫入文件時要使用的塊大小?我對這個領域相當新手,只是閱讀使用更大的文件大文件(我目前使用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

文件傳輸出了什麼問題? – 2010-07-26 02:13:19

+1

你能告訴我們你試圖追加到文件嗎?你應該能夠尋求並繼續寫作。你打開使用文件模式「A」? – 2010-07-26 07:14:31

+0

文件傳輸沒有什麼問題。但是,當我開發這個代碼將網絡文件大小移動到6 + gb時,能夠啓動它來觀察新的變化並讓它在大文件傳輸中停止的地方很好。我已將代碼添加到操作中。 – Cryptite 2010-08-08 20:35:44

回答

1

對於問題的第二部分,數據通常是以512字節的塊讀取和寫入硬盤驅動器的。所以使用一個塊的大小應該是最有效的傳輸。除此之外,這並不重要。請記住,無論您指定的塊大小是I/O操作在任何給定時間內存儲在內存中的數據量,請不要選擇那麼大的內存以至於耗盡大量內存。我認爲8K(8192)是常用選擇,但64K應該沒問題。 (當你選擇最佳塊大小時,我認爲文件大小並不重要)

+0

操作系統之間通常會有一層緩衝區,所以即使您使用的是*不是512的倍數,它可能並不重要。但是嘗試不同的塊大小並不重要,如果你想確定的話,你可以自己進行基準測試! – Wim 2010-08-08 20:43:47