C #에서 해시 테이블 및 사전의 실제 크기 제한


12

C # 4 Dictionary 또는 Hashtable에 포함될 수있는 항목 수와 이러한 구조에 포함 할 수있는 총 바이트 수에 대한 실제 제한은 무엇입니까? 나는 많은 수의 물체를 가지고 작업 할 것이며이 구조물이 언제 문제를 일으키기 시작하는지 알고 싶습니다.

문맥 상으로, 나는 많은 메모리를 가진 64 비트 시스템을 사용할 것입니다. 또한 어떤 형태 또는 '키'를 사용하여 객체를 찾아야합니다. 성능 요구 사항을 감안할 때 이러한 개체는 메모리에 상주해야하며 많은 개체가 오래 지속됩니다.

타사 또는 오픈 소스 라이브러리를 사용하지 않아야하지만 다른 접근법 / 패턴을 제안하십시오. 사양상의 이유로 네이티브 C # ( 또는 C ++ \ CLI )을 사용하여이를 빌드 할 수 있어야합니다 .


1
이러한 활용을 조롱하고 다른 활용 / 부하에서 추가 / 제거 / 조회 성능을 측정하는 데 단 1-2 시간이 걸립니다. VS2010은 성능 테스트 골격을 제공한다고 생각합니다. 여기서 말하는 사람이 무엇이든, 작성할 코드에는 직접 또는 메타 데이터로 이름이 표시됩니다.
Job

답변:


8

지적해야 할 것은 사전이 객체 자체를 보유하지 않고 (메모리 공간이 클 수 있음) 객체에 대한 참조 만 제공하므로 객체가 복잡한 경우 사전 크기에 영향을 미치지 않습니다.

메모리의 사전에서 수천 개의 항목을 함께 수집했으며 문제는 사전의 크기가 아니라 메모리 자체의 크기입니다. 이 경우 사전 자체는 관련된 메모리의 작은 부분이었습니다.

큰 사전의 경우 고려해야 할 한 가지는 사전 용량을 수동으로 구성하고 관리하는 것입니다. 정상적인 상황에서 .Net은이 세부 사항을 관리합니다 (현재 구현에서 공간이 부족한 경우 사전 현재 크기의 두 배인 소수로 크기가 조정 됨). 그러나 큰 사전을 만들거나 .Net 대신 사전을 확장하려고한다는 것을 알고 있다면 (상대적으로 비용이 많이 드는) 사전을 추측하고 크기를 조정하는 것이 좋습니다. 크기 및 나중에 크기 조정 관리). 사전 용량이 무엇인지에 대한 합리적인 휴리스틱 아이디어가있는 경우 사전 용량을 관리하여이를 수행 할 수 있습니다. Microsoft는 이것을 권장합니다Dictionary 개체에 대한 설명의 MSDN . 그러나 테스트가 얼마나 엄격한 지 확실하지 않고 사전이 매우 빠르게 크기를 조정할 때 .Net 플랫폼이 적용하는 다른 최적화가 있는지 확실하지 않지만 이 접근법실제 가치 에 대한 논쟁이있는 것 같습니다 .

이것은 객체 및 메모리 크기에 대한 유용한 스택 오버플로 질문 입니다.


2

실제 제한은 소프트웨어가 실행중인 시스템 및 이러한 데이터 구조 내에 실제로 포함 할 오브젝트 수에 상대적 일 수 있습니다. Oded가 언급했듯이 int.MaxValue는 많은 수이지만 20 억 개의 항목이 실제 한계와 동일합니까? 메모리에 많은 항목을 저장하는 것은 그리 실용적이지 않을 수 있습니다.


0

설명서에는 데이터가 실제로 저장된 위치가없고 한계를 지정하지 않았으므로 스토리지 할당 전후에 예상되는 최대 예상 크기로 실험을 수행하고 시스템 메모리를 기록해 두는 것이 좋습니다.


-1

최근에 github 프로젝트 hash-table-shootout (여기 : https://github.com/jimbelton/hash-table-shootout )을 업데이트했습니다. 표준 gcc 비 순차 맵은 40M 객체를 저장하기 위해 약 1.8GB의 오버 헤드를가집니다. 이것은 나에게는 끔찍한 것처럼 보이지만 최고의 성능을 자랑하는 메모리 인 Google sparse_hash_map도 600MB를 차지하며 사용으로 인해 성능이 저하됩니다. 포함 된 알고리즘 중 속도를 원하는 경우 Glib GHashTable이 가장 빠르며 메모리 성능이 좋습니다 (약 1.3GB 오버 헤드). 벤치 마크 결과는 https://jimbelton.wordpress.com/2015/07/01/hash-table-shootout-on-github/에 게시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.