在Python中恢复大文件写入

4 投票
1 回答
1548 浏览
提问于 2025-04-16 01:49

我有一个很大的文件要传输(大约4GB),我不想用shutil这个工具,而是想用普通的文件操作来打开和写入,这样我可以在传输过程中显示进度百分比。

然后我想到,如果在写文件的过程中出现问题,我能否尝试恢复写入。我到现在为止还没找到好的办法。我原以为可以通过巧妙地调整读取源文件的位置和使用seek来实现,但到现在为止都没有成功。有没有什么好的建议呢?

另外,有没有什么动态的方法可以确定在读取和写入文件时应该使用多大的块大小?我对这方面还比较陌生,只是听说对于大文件应该使用更大的块(我现在用的是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多,这对你们来说可能是显而易见的。有什么好的想法吗?

1 个回答

1

关于你问题的第二部分,数据通常是以512字节为一个块来从硬盘读取和写入的。所以,如果你选择的块大小是这个512字节的倍数,传输效率会更高。除此之外,块大小其实没那么重要。你只需要记住,你指定的块大小就是每次I/O操作在内存中存储的数据量,所以不要选择一个太大的块大小,以免占用太多的内存。我觉得8K(8192字节)是个常见的选择,但64K也没问题。(我认为在选择最佳块大小时,文件的大小并不是特别重要)

撰写回答