MD5 และ SHA-1 แฮชของไฟล์ขนาดใหญ่

แก้ไขแล้ว - ฉันใช้การผสมผสานระหว่างการจัดการด้วยตนเอง (ข้ามตัวรวบรวมขยะ) และตัวเลือก NSData ที่แมป ปรากฎว่า iStat ไม่มีตัวเลขหน่วยความจำที่ถูกต้อง และเครื่องมือก็ระบุถึงพฤติกรรมที่คาดหวัง นอกจากนี้ การเรียก CC_MD5() และ CC_SHA1() ยังได้เรียกเข้าสู่ CC_MD5_Update() และ CC_SHA1_Update() อยู่แล้ว ดังนั้นจึงไม่ก่อให้เกิดปัญหาเช่นกัน

ขณะนี้ฉันกำลังทำงานกับแอปพลิเคชัน Cocoa ที่ต้องการแฮชไฟล์ขนาดใหญ่โดยใช้ SHA-1 และ MD5 ฉันใช้ CC_MD5 และ CC_SHA1 และอ่านไฟล์ไปยังวัตถุ NSData อย่างไรก็ตาม สิ่งนี้ใช้ RAM จำนวนมหาศาลและทำให้หน่วยความจำรั่วเหมือนตะแกรงด้วยเหตุผลบางประการ แม้ว่าจะไม่ได้อ้างอิงออบเจ็กต์ NSData ก็ตาม… ฉันสงสัยว่าเป็นคนเก็บขยะที่พยายามตามทัน

อะไรคือสิ่งที่ดีที่สุด (ง่ายที่สุดถ้าเป็นไปได้เช่นกัน แต่ฉันไม่รังเกียจที่จะทำงานพิเศษเพื่อเร่งความเร็ว) วิธีดำเนินการแฮช MD5 และ SHA-1 กับไฟล์ขนาดใหญ่เช่นนี้

ติดตามผล

ดังที่ได้กล่าวไว้ด้านล่าง การแมป NSData อาจช่วยได้ แต่ฉันคิดว่าฉันพบตัวเลือกอื่นแล้ว มันยังต้องปรับปรุงอีกบ้าง แต่ดูเหมือนว่าจะเป็นวิธีแก้ปัญหาที่แข็งแกร่งกว่ามาก แนวคิดคือการใช้ NSFileHandle และอ่าน "ชิ้นข้อมูล" - ดังนั้นอาจสูงสุดครั้งละ 256MB จากนั้น (สำหรับตัวอย่าง MD5) ให้ใช้ CC_MD5() ตามด้วยชุดของ CC_MD5_Update() เพื่อคำนวณแฮชเป็นชิ้น ๆ เมื่อรวมกับการจัดการหน่วยความจำด้วยตนเองก็น่าจะช่วยได้


person Justin Mrkva    schedule 06.10.2011    source แหล่งที่มา
comment
คุณช่วยกรุณาโพสต์รหัสของคุณว่าคุณทำสิ่งนี้ได้อย่างไร? ขอบคุณ!   -  person Parth    schedule 20.04.2018


คำตอบ (1)


คุณใช้ไฟล์ Memory Mapped หรือไม่? ด้วยวิธีนี้คุณไม่จำเป็นต้องอ่านไฟล์ทั้งหมดลงในหน่วยความจำและระบบปฏิบัติการจะดูแลแคชที่จำเป็น:

[NSData dataWithContentsOfFile:@"filename.dat" 
                       options:NSDataReadingMappedIfSafe 
                         error:&error];

(คุณยังสามารถใช้ NSDataReadingMappedAlways เพื่อบังคับการแมปหน่วยความจำ)

person Tony Million    schedule 06.10.2011
comment
ฉันลองแล้วเพราะดูเหมือนมันจะเป็นวิธีแก้ปัญหาที่ดี แต่ก็ยังมีรอยรั่วที่น่ารังเกียจอยู่บ้าง ฉันกำลังเปลี่ยนกลับไปใช้การจัดการด้วยตนเอง (ข้ามตัวรวบรวมขยะ) ดังนั้นฉันจึงต้องการดูว่าสิ่งนี้รวมกับความช่วยเหลือในการเปิดตัวอย่างชัดเจนหรือไม่ - person Justin Mrkva; 06.10.2011
comment
ดูการติดตามผลของฉันด้านบนเกี่ยวกับการอ่านไฟล์เป็นชิ้น ๆ ฉันจะลองรวมกับการจัดการหน่วยความจำด้วยตนเอง จากนั้นลองใช้ NSData ที่แมปไว้ด้านบนเพื่อดูว่าจะสร้างความแตกต่างภายใต้เงื่อนไขเหล่านั้นหรือไม่ - person Justin Mrkva; 06.10.2011
comment
โอเค ฉันเปลี่ยนมาใช้โหมดแมนนวลแล้ว และตัวเก็บขยะก็เป็นส่วนหนึ่งของปัญหาจริงๆ ฉันลองอ่านค่าที่แมปอีกครั้ง และดูเหมือนว่าตามการติดตามหน่วยความจำในเครื่องมือ จริงๆ แล้วมันไม่ได้ใช้จำนวนหน่วยความจำ iStat Menus คิดว่ากำลังใช้... การใช้หน่วยความจำไม่เคยเกิน 10MB ของการจัดสรรในหน่วยความจำจริง นอกจากนี้ ฉันค้นพบว่า CC_MD5 และ CC_SHA1 เรียกใช้ทั้ง CC_MD5_Update และ CC_SHA1_Update ดังนั้นจึงไม่ก่อให้เกิดปัญหาเช่นกัน แก้ไขปัญหา! :) - person Justin Mrkva; 07.10.2011