현재 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까지 번호가 매겨 짐