ฉันกำลังทำงานกับตัวดาวน์โหลดแบบมัลติเธรดด้วยความช่วยเหลือของโมดูล PycURL ฉันกำลังดาวน์โหลดบางส่วนของไฟล์และรวมเข้าด้วยกันในภายหลัง
ชิ้นส่วนจะถูกดาวน์โหลดแยกต่างหากจากหลายเธรดซึ่งจะถูกเขียนไปยังไฟล์ชั่วคราวในโหมดไบนารี แต่เมื่อฉันรวมเข้าไปในไฟล์เดียว (รวมอยู่ในลำดับที่ถูกต้อง) checksums ไม่ตรงกัน
สิ่งนี้จะเกิดขึ้นใน linux env เท่านั้น สคริปต์เดียวกันนี้ทำงานได้อย่างไม่มีที่ติใน 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 การตรวจสอบของไฟล์จะตรงกันปัญหาคือการรวมไฟล์ของงูใหญ่
แก้ไข:
นี่คือไฟล์และ checksums (sha256) ที่ฉันใช้ในการทำให้เกิดปัญหาซ้ำ:
- ไฟล์ต้นฉบับ
- แฮช: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- ไฟล์ถูกรวมโดยสคริปต์
- แฮช: c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
-
- แฮช: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
คำสั่งที่ใช้:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
ไฟล์ส่วน - หมายเลขที่ส่วนท้ายจาก 0 ถึง 7
filename
, self.tempfile_arr
และshutil
จะไม่ได้กำหนด
open
โหมดของคุณไม่ถูกต้อง (wb
) ตามstackoverflow.com/a/4388244/3727050คุณต้องการab
(หรือr+b
และseek
)