ขีด จำกัด ขนาดที่ใช้ได้จริงของ Hashtable และ Dictionary ใน c #


12

อะไรคือข้อ จำกัด ในทางปฏิบัติสำหรับจำนวนรายการที่พจนานุกรม C # 4 หรือ Hashtable สามารถมีได้และจำนวนไบต์ทั้งหมดโครงสร้างเหล่านี้อาจมีเหตุผล ฉันจะทำงานกับวัตถุจำนวนมากและต้องการทราบว่าโครงสร้างเหล่านี้เริ่มมีปัญหาเมื่อใด

สำหรับบริบทฉันจะใช้ระบบ 64 บิตกับหน่วยความจำมากมาย นอกจากนี้ฉันจะต้องค้นหาวัตถุโดยใช้รูปแบบบางอย่างหรือ 'คีย์' เมื่อพิจารณาถึงความต้องการประสิทธิภาพวัตถุเหล่านี้จะต้องอยู่ในหน่วยความจำและส่วนใหญ่จะมีอายุการใช้งานยาวนาน

อย่าลังเลที่จะแนะนำวิธีการ / รูปแบบอื่น ๆ แม้ว่าฉันจะต้องหลีกเลี่ยงการใช้ห้องสมุดบุคคลที่สามหรือโอเพ่นซอร์ส สำหรับเหตุผลในสเปคฉันต้องสามารถสร้างสิ่งนี้โดยใช้ native C # ( หรือ C ++ \ CLI )


1
ควรใช้เวลาเพียงชั่วโมงเดียวหรือสองชั่วโมงในการเยาะเย้ยสิ่งนั้นและวัดประสิทธิภาพการเพิ่ม / ลบ / ค้นหาภายใต้การใช้งาน / โหลดที่แตกต่างกัน ฉันเชื่อว่า VS2010 ยังมีโครงกระดูกทดสอบประสิทธิภาพสำหรับคุณ ไม่ว่าใครจะพูดอะไรที่นี่รหัสที่คุณจะเขียนจะมีชื่อของคุณอยู่โดยตรงหรือในเมตาดาต้า
งาน

คำตอบ:


8

สิ่งหนึ่งที่ชี้ให้เห็นได้คือพจนานุกรมจะไม่เก็บวัตถุเอง (ซึ่งอาจมีหน่วยความจำขนาดใหญ่) แต่เป็นการอ้างอิงไปยังวัตถุดังนั้นหากวัตถุมีความซับซ้อนจะไม่มีผลกระทบต่อขนาดพจนานุกรม

ฉันได้รวบรวมหลายพันรายการไว้ด้วยกันในพจนานุกรมในหน่วยความจำและปัญหาไม่ใช่ขนาดของพจนานุกรม แต่ขนาดของวัตถุในหน่วยความจำ ในกรณีเหล่านี้พจนานุกรมเป็นส่วนเล็ก ๆ ของหน่วยความจำที่เกี่ยวข้อง

สิ่งหนึ่งที่คิดในกรณีของพจนานุกรมขนาดใหญ่คือการกำหนดค่าและจัดการความจุพจนานุกรมด้วยตนเอง ภายใต้สถานการณ์ปกติ. Net จัดการค่าปรับนี้ (ในการปรับใช้ปัจจุบันหากพื้นที่ไม่เพียงพอจะปรับขนาดเป็นจำนวนเฉพาะที่มีขนาดอย่างน้อยสองเท่าของขนาดปัจจุบันของพจนานุกรม) อย่างไรก็ตามหากคุณรู้ว่าคุณกำลังจะสร้างพจนานุกรมขนาดใหญ่หรือกำลังจะขยายพจนานุกรมแทน. Net การคาดเดาและปรับขนาดพจนานุกรมสำหรับคุณ (ซึ่งค่อนข้างแพง) มันน่าจะเป็นการดีกว่าถ้าคุณเริ่มต้นด้วยตัวคุณเอง ขนาดและอาจจัดการปรับขนาดในภายหลัง) สิ่งนี้สามารถทำได้โดยการจัดการความจุพจนานุกรมถ้าคุณมีความคิดแบบฮิวริสติกที่สมเหตุสมผลว่าความจุของพจนานุกรมควรเป็นเท่าไหร่ Microsoft แนะนำสิ่งนี้ในMSDN ในคำพูดของพวกเขาบนวัตถุพจนานุกรม อย่างไรก็ตามดูเหมือนว่าจะมีการถกเถียงเกี่ยวกับคุณค่าที่แท้จริงของวิธีการนี้แม้ว่าฉันจะไม่แน่ใจว่าการทดสอบนั้นเข้มงวดเพียงใดและหากมีการเพิ่มประสิทธิภาพอื่น ๆ ที่แพลตฟอร์ม. Net วางไว้เมื่อพจนานุกรมมีการปรับขนาดอย่างรวดเร็วมาก

นี่เป็นคำถาม Stack Overflow ที่มีประโยชน์เกี่ยวกับวัตถุและขนาดหน่วยความจำ


2

ข้อ จำกัด ในทางปฏิบัติอาจสัมพันธ์กับเครื่องที่ซอฟต์แวร์ของคุณกำลังทำงานอยู่รวมถึงจำนวนวัตถุที่คุณวางแผนจะบรรจุไว้ภายในโครงสร้างข้อมูลเหล่านี้ ดังที่ Oded ได้กล่าวไว้ int.MaxValue เป็นจำนวนมาก แต่รายการ 2 พันล้านรายการถือเป็นขีด จำกัด ในทางปฏิบัติหรือไม่? การจัดเก็บหลายรายการในหน่วยความจำนั้นอาจไม่สามารถนำไปใช้ได้จริงมาก


0

เนื่องจากเอกสารไม่ได้บอกว่าข้อมูลถูกเก็บไว้ที่ไหนและไม่ได้ระบุขีด จำกัด ฉันขอแนะนำให้คุณทำการทดลองด้วยขนาดสูงสุดที่คาดว่าคุณน่าจะมีและจดบันทึกหน่วยความจำระบบก่อนและหลังการจัดสรรหน่วยความจำ


-1

ฉันเพิ่งอัปเดตโปรเจ็กต์ hith-table-shootout (ที่นี่: https://github.com/jimbelton/hash-table-shootout ) แผนที่ที่ไม่ได้เรียงลำดับ gcc มาตรฐานมีค่าใช้จ่ายประมาณ 1.8 GBytes เพื่อเก็บวัตถุ 40M สิ่งนี้ดูจะโหดร้ายสำหรับฉัน แต่แม้กระทั่งหน่วยความจำนักแสดงที่เก่งที่สุดก็คือ Google sparse_hash_map ใช้เวลา 600 Mbytes และคุณจ่ายค่าปรับสำหรับการใช้งาน หากคุณต้องการความรวดเร็วของอัลกอริธึม Glib GHashTable นั้นเร็วที่สุดและมีประสิทธิภาพหน่วยความจำที่ดี (ประมาณ 1.3 Gbytes เหนือหัว) ผลลัพธ์การวัดประสิทธิภาพมีการโพสต์ที่นี่: https://jimbelton.wordpress.com/2015/07/01/hash-table-shootout-on-github/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.