恢复用Python编写大型文件
我有一个大的文件传输(比如4gb左右),而不是使用shutil,我只是以正常的文件方式打开和写入它,这样我就可以在它运行时包含一个进度百分比 然后,我突然想到,如果由于某种原因,文件在写入过程中发生故障,我会尝试恢复文件写入。不过我运气不好。我认为这将是抵消源文件读取和使用seek的巧妙组合,但到目前为止我还没有任何运气。有什么想法吗 此外,在读写文件时,是否有某种动态方式来确定要使用的块大小?我对这一领域相当陌生,只是阅读以使用更大的文件大小(目前我使用的是65536)。有没有一个聪明的方法来做这件事,或者人们只是猜测。。?谢谢各位 以下是附加文件传输的代码段:恢复用Python编写大型文件,python,file-io,resume,Python,File Io,Resume,我有一个大的文件传输(比如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)
它确实会追加并开始写入,但随后它会在结尾写入比它应该写入的数据更多的数据,这可能是您其他人显而易见的原因。有什么想法吗?对于问题的第二部分,数据通常以512字节的块从硬盘驱动器读取和写入。因此,使用块大小的倍数应该可以提供最有效的传输。除此之外,这没什么大不了的。请记住,指定的块大小是I/O操作在任何给定时间存储在内存中的数据量,因此不要选择占用大量RAM的大数据块。我认为8K(8192)是一个常见的选择,但64K应该可以。(当您选择最佳块大小时,我认为传输的文件大小无关紧要)文件传输出了什么问题?您能告诉我们您试图附加到文件中吗?你应该能够寻找并继续写作。您是使用文件模式“a”打开的吗?文件传输没有任何问题。但当我开发这段代码在网络上移动6+gb大小的文件时,很高兴能够启动它来观察新的变化,并让它在大文件传输时恢复原来的状态。我已经将代码附加到op中。我也会使用
b
模式打开目标文件,只是为了保存(虽然我认为这不是你的问题)。操作系统通常会在两者之间设置一层缓冲区,因此即使你使用的不是512的倍数,也可能没那么重要。但是,尝试不同的块大小是很简单的,如果您想确定的话,您可以自己进行基准测试!