현재 PycURL 모듈의 도움을 받아 멀티 스레드 다운로더에서 작업하고 있습니다. 파일의 일부를 다운로드하고 나중에 병합합니다.
부분은 여러 스레드와 별도로 다운로드되고 바이너리 모드로 임시 파일에 기록되지만 단일 파일로 병합하면 올바른 순서로 병합됩니다. 체크섬이 일치하지 않습니다.
이것은 리눅스 환경에서만 발생합니다. 동일한 스크립트가 Windows 환경에서 완벽하게 작동합니다.
파일을 병합하는 코드 (스크립트의 일부)입니다.
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
리눅스에서 수동으로 부품 파일을 단일 파일로 만들면 파일의 체크섬이 일치하면 문제는 파이썬의 파일 병합과 관련이 있습니다.
편집 :
다음은 문제를 재현하는 데 사용한 파일과 체크섬 (sha256)입니다.
- 원본 파일
- 해시 : 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- 스크립트로 병합 된 파일
- 해시 : c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
-
- 해시 : 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
사용 된 명령 :
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
부품 파일 -끝에서 0부터 7까지 번호가 매겨 짐
일부 임시 파일을 포함 하여 최소한의 재현 가능한 예 를 제공해야합니다 . 나는 단지 몇 바이트의 임시 파일로 문제를 재현 할 수 있어야한다고 생각합니다. 바라건대 버퍼 크기는 문제의 일부가 아닙니다. 또한 바이너리 모드는 중요하지 않으므로 일반 텍스트 파일을 사용할 수 있습니다.
—
wjandrea
FWIW 불행히도 Linux에서 두 개의 매우 짧은 텍스트 파일로 문제를 재현 할 수 없었습니다.
—
wjandrea
실제로 pycurl은 데이터를 쓰려면 바이너리 모드가 필요합니다.
—
Saumyakanta Sahoo
OK, 파일 도움말하지만 코드가 불완전 여전히 :
—
wjandrea
filename
, self.tempfile_arr
,와 shutil
정의되지 않은 있습니다
open
모드가 옳지 않다고 생각합니다 (wb
). 를 기반으로 stackoverflow.com/a/4388244/3727050 당신이 필요로ab
(또는r+b
과seek
)