python - 恢复用 Python 写入大文件

标签 python file-io resume

我有一个大文件传输(比如 4gb 左右),而不是使用 shutil,我只是以正常的文件方式打开和写入它,这样我就可以在它移动时包括一个进度百分比。

然后我想到尝试恢复文件写入,如果由于某种原因它在过程中失败了。虽然我没有任何运气。我认为这将是抵消源文件读取和使用搜索的一些巧妙组合,但到目前为止我还没有运气。有什么想法吗?

此外,是否有某种动态方式来计算读取和写入文件时使用的 block 大小?我对那个领域相当陌生,只是阅读以使用更大的尺寸来获得更大的文件(我现在使用的是 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 的数据比它应该的多,这对你们其他人来说可能是显而易见的原因。有什么想法吗?

最佳答案

对于问题的第二部分,数据通常以 512 字节的 block 为单位从硬盘驱动器读取和写入。因此,使用它的倍数的 block 大小应该可以提供最有效的传输。除此之外,没有太大关系。请记住,您指定的任何 block 大小都是 I/O 操作在任何给定时间存储在内存中的数据量,因此不要选择大到会占用大量 RAM 的大小。我认为 8K (8192) 是一个常见的选择,但 64K 应该没问题。 (当您选择最佳 block 大小时,我认为正在传输的文件的大小并不重要)

关于python - 恢复用 Python 写入大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3331825/

相关文章:

python - 是否可以在运行时将参数传递给 python 生成的 exe?

java - 如何使用正在读取的文本文件的值填充 "ragged"数组?

php - 从文件中读取最后一行

javascript - 如何使用鼠标移动网页上的页面部分(段落)?

Python - 将日期时间列转换为秒

python - Django:无效的 block 标记 'form.username'

python - Django 模型与用户模型的关系

c++ - 如何在 C++ 中将整个文件读入 std::string?

android - 如何从 Android 中的应用程序恢复以前运行的应用程序?

video - 如何在编码期间暂停和恢复ffmpeg?