4

私は大きなファイル転送(たとえば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に書き込みます。何か案は?

4

1 に答える 1

1

質問の2番目の部分では、データは通常、512バイトのブロックでハードドライブから読み取られ、ハードドライブに書き込まれます。したがって、その倍数のブロックサイズを使用すると、最も効率的な転送が可能になります。それ以外は大した問題ではありません。指定するブロックサイズは、I / O操作が常にメモリに格納するデータの量であることに注意してください。したがって、RAMを大量に消費するほど大きなものを選択しないでください。8K(8192)が一般的な選択だと思いますが、64Kで十分です。(最適なブロックサイズを選択する場合、転送されるファイルのサイズはそれほど重要ではないと思います)

于 2010-07-26T02:16:54.537 に答える