Batas ukuran praktis dari Hashtable dan Kamus di c #

12

Berapa batas praktis untuk jumlah item yang dapat dikandung oleh Kamus C atau 4 atau Hashtable dan jumlah total byte yang dapat dimasukkan oleh struktur ini secara wajar. Saya akan bekerja dengan sejumlah besar objek dan ingin tahu kapan struktur ini mulai mengalami masalah.

Untuk konteksnya, saya akan menggunakan sistem 64 bit dengan banyak memori. Juga, saya harus menemukan objek menggunakan beberapa bentuk atau 'kunci'. Mengingat tuntutan kinerja, objek-objek ini harus berada dalam memori, dan banyak yang akan berumur panjang.

Jangan ragu untuk menyarankan pendekatan / pola lain, meskipun saya harus menghindari menggunakan perpustakaan pihak ketiga atau sumber terbuka. Untuk alasan spesifikasi, saya harus bisa membuatnya menggunakan C # asli ( atau C ++ \ CLI ).

JoeGeeky
sumber
1
Seharusnya hanya butuh satu atau dua jam untuk mengejek hal itu dan mengukur kinerja tambah / hapus / pencarian di bawah berbagai pemanfaatan / beban. Saya percaya VS2010 bahkan menyediakan kerangka pengujian kinerja untuk Anda. Tidak peduli apa kata orang di sini, kode yang akan Anda tulis akan memiliki nama Anda di dalamnya, secara langsung atau dalam metadata.
Pekerjaan

Jawaban:

8

Satu hal yang perlu diperhatikan adalah bahwa Kamus tidak akan menahan objek itu sendiri (yang mungkin memiliki jejak memori yang besar) tetapi hanya referensi ke objek sehingga jika objek tersebut kompleks ini tidak berdampak pada ukuran Kamus.

Saya telah mengumpulkan beberapa ribu item bersama dalam Kamus di memori dan masalahnya bukan ukuran Kamus tetapi ukuran objek itu sendiri dalam memori. Dalam kasus ini Kamus itu sendiri adalah sebagian kecil dari memori yang terlibat.

Satu hal yang perlu dipikirkan dalam kasus Kamus besar adalah mengkonfigurasi dan mengelola kapasitas Kamus secara manual. Dalam keadaan normal .Net mengelola denda ini (dalam implementasi saat ini jika kehabisan ruang, ia mengubah ukuran menjadi bilangan prima yang setidaknya dua kali ukuran kamus saat ini). Namun, jika Anda tahu Anda akan membuat Kamus besar atau akan memperluas Kamus alih-alih. Net menebak dan mengubah ukuran Kamus untuk Anda (yang relatif mahal) mungkin lebih baik Anda melakukan ini sendiri (tentu saja dengan yang awal ukuran dan mungkin mengelola ukuran kemudian). Ini dapat dilakukan dengan mengelola kapasitas Kamus jika Anda memiliki ide heuristik yang masuk akal tentang apa kapasitas Kamus. Microsoft merekomendasikan ini padaMSDN dalam sambutannya pada objek Kamus . Namun, tampaknya ada beberapa perdebatan tentang nilai sebenarnya dari pendekatan ini walaupun saya tidak yakin seberapa ketat tes itu dan apakah ada optimisasi lain yang dilakukan oleh platform .Net ketika kamus mengubah ukuran dengan sangat cepat.

Ini adalah pertanyaan Stack Overflow yang berguna tentang ukuran objek dan memori.

AlexC
sumber
2

Batas praktis dapat relatif terhadap mesin yang digunakan oleh perangkat lunak Anda serta berapa banyak objek yang Anda rencanakan untuk terkandung dalam struktur data ini. Seperti yang disebutkan Oded, int.MaxValue adalah angka yang besar, tetapi apakah 2 miliar item sama dengan batas praktis? Menyimpan banyak item dalam memori kemungkinan tidak terlalu praktis.

Bernard
sumber
0

Karena dokumentasi tidak memberi tahu di mana data disimpan secara fisik dan tidak menentukan batasnya, saya sarankan Anda melakukan percobaan dengan ukuran maksimum yang diharapkan yang mungkin Anda miliki dan catat memori sistem sebelum dan setelah alokasi penyimpanan.

Tidak mungkin
sumber
-1

Saya baru-baru ini memperbarui proyek hasth-table-shootout github (di sini: https://github.com/jimbelton/hash-table-shootout ). Peta gcc unordered standar memiliki sekitar 1,8 GB overhead untuk menyimpan 40 juta objek. Ini tampaknya cukup mengerikan bagi saya, tetapi bahkan memori berkinerja terbaik sekalipun, Google sparse_hash_map, membutuhkan 600 Mbytes, dan Anda membayar penalti performa untuk menggunakannya. Jika Anda menginginkan kecepatan, dari algoritma yang disertakan, Glib GHashTable adalah yang tercepat, dan memiliki kinerja memori yang baik (sekitar overhead 1,3 Gbytes). Hasil benchmark diposting di sini: https://jimbelton.wordpress.com/2015/07/01/hash-table-shootout-on-github/

Jim Belton
sumber