私は現在PycURLモジュールの助けを借りてマルチスレッドダウンローダーに取り組んでいます。ファイルの一部をダウンロードして、後でマージします。
パーツは複数のスレッドから個別にダウンロードされ、バイナリモードで一時ファイルに書き込まれますが、それらを単一のファイルにマージすると(正しい順序でマージされます)、チェックサムが一致しません。
これはLinux環境でのみ発生します。同じスクリプトがWindows envで問題なく動作します。
これは、ファイルをマージするコード(スクリプトの一部)です。
with open(filename,'wb') as outfile:
print('Merging temp files ...')
for tmpfile in self.tempfile_arr:
with open(tmpfile, 'rb') as infile:
shutil.copyfileobj(infile, outfile)
print('Done!')
私write()
もメソッドを試しました が、同じ問題が発生し、大きなファイルには大量のメモリが必要になります。
cat
Linuxでパーツファイルを手動で1つのファイルにしてから、ファイルのチェックサムが一致する場合、問題はpythonによるファイルのマージにあります。
編集:
問題を再現するために使用したファイルとチェックサム(sha256)は次のとおりです。
- 元のファイル
- ハッシュ:158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- スクリプトによってマージされたファイル
- ハッシュ:c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
-
- ハッシュ:158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
使用したコマンド:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
いくつかのサンプル一時ファイルを含む、最小限の再現可能なサンプルを提供する必要があります。それぞれ数バイトの一時ファイルで問題を再現できるはずです。うまくいけば、バッファサイズは問題の一部ではありません。また、バイナリモードはおそらく重要ではないため、プレーンテキストファイルを使用できます。
—
wjandrea
FWIW Linuxで2つの非常に短いテキストファイルを使用して問題を再現できませんでした。
—
wjandrea
実際、pycurlはデータを書き込むためにバイナリモードを必要とします。
—
Saumyakanta Sahoo
OK、ファイルのヘルプが、あなたのコードが不完全まだだ:
—
wjandrea
filename
、self.tempfile_arr
、およびshutil
不定です
open
モードは正しくないと思います(wb
)。基づいてstackoverflow.com/a/4388244/3727050あなたが必要とするab
(またはr+b
とseek
)