Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
恢复用Python编写大型文件_Python_File Io_Resume - Fatal编程技术网

恢复用Python编写大型文件

恢复用Python编写大型文件,python,file-io,resume,Python,File Io,Resume,我有一个大的文件传输(比如4gb左右),而不是使用shutil,我只是以正常的文件方式打开和写入它,这样我就可以在它运行时包含一个进度百分比 然后,我突然想到,如果由于某种原因,文件在写入过程中发生故障,我会尝试恢复文件写入。不过我运气不好。我认为这将是抵消源文件读取和使用seek的巧妙组合,但到目前为止我还没有任何运气。有什么想法吗 此外,在读写文件时,是否有某种动态方式来确定要使用的块大小?我对这一领域相当陌生,只是阅读以使用更大的文件大小(目前我使用的是65536)。有没有一个聪明的方法来

我有一个大的文件传输(比如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的倍数,也可能没那么重要。但是,尝试不同的块大小是很简单的,如果您想确定的话,您可以自己进行基准测试!