2009-05-12 5 views
4

많은 데이터를 보유하고있는 일반 사전이 있습니다. Dictionary의 크기가 너무 많은 메모리를 차지하기 시작할 때 아이템을 제거하기 시작했습니다.C# /. NET : 사전 메모리 사용량

내 사전에서이 사전에서 사용 된 RAM을 모니터링하는 가장 좋은 방법은 무엇입니까?

사전의 각 항목은 가변 크기입니다.

+0

왜 asp.net 캐시를 사용하지 않습니까? 그것은 http 문맥없이 작동하고 당신이 ... (http://www.hanselman.com/blog/UsingTheASPNETCacheOutsideOfASPNET.aspx) –

답변

5

각 항목의 크기 운동과 Dictionary.Count

한 가지 방법으로 번식는 here 같습니다

메모리 오브젝트 사용의 크기를 결정하는 대략적인 방법은에 의해 을 수행 할 수 있습니다 개체를 생성하기 전과 후에 총 메모리 을 확인합니다. 다음 예제에서 은 foo라는 클래스가 있다고 가정합니다.

long StopBytes = 0; 
foo myFoo; 

long StartBytes = System.GC.GetTotalMemory(true); 
myFoo = new foo(); 
StopBytes = System.GC.GetTotalMemory(true); 
GC.KeepAlive(myFoo); // This ensures a reference to object keeps object in memory 

MessageBox.Show("Size is " + ((long)(StopBytes - StartBytes)).ToString()); 

C#을, 그러나 그것은 해당 유형의 필드가 될 것입니다 크기를 반환, 그것은 C/C++에서와 같이 작동하는 '를 sizeof'연산자가 있습니다. 따라서 참조 유형 (클래스가 아닌 구조체)의 경우 포인터 크기 (32 비트 시스템에서는 4)가 항상 반환됩니다. 대신 System.Runtime.InteropServices.Marshal.SizeOf()을 사용하십시오.

+1

를 요구하고있는 특징이 "각 품목의 크기를 운동하십시오." 방법? 위에서 언급 한대로 – BFree

+0

이것은 스레드로부터 안전하지 않으며 실제로 음수를 반환 할 수 있습니다. – jellomonkey

+1

@jellomonkey : 사실이지만 그렇다고 볼 수는 없습니다. 그는 실제 생산 코드에서이 작업을 수행 할 것을 제안하지 않았습니다. 오히려 크기를 결정하는 테스트 프로젝트에서 (자주 변경되지 않는다고 가정 할 때). –

-1

사전에 항목을 추가 할 때 항목 추가 크기를 계산하고 사전에서 항목을 제거 할 때 추가 된 모든 항목의 합계를 단일 정수 값으로 유지합니다.이 값은 감소합니다.

+0

항목의 크기는 어떻게 계산합니까? – stakx

1

개체의 실제 크기를 제공하는 API가 있다고 생각하지 않지만 개체 생성 전후에 사용 된 메모리 양을 측정하여 확인할 수 있습니다. 그러나 실제로는 스레드로부터 안전하지 않습니다.

System.Runtime.InteropServices.Marshal.SizeOf()를 사용하여 정확한 크기를 제공하지 않아도 정확한 비교 지점을 제공하므로 다음과 같은 결과를 얻을 수 있습니다. X %만큼 증가한 다음 Y 요소 수를 제거합니다.

또한 누적 합계를 유지하려고 할 수 있지만 컬렉션의 항목을 편집 할 수있는 경우 모든 추가, 제거 및 편집이 계산에 포함되는지 확인해야합니다. 추가하고 제거 할 항목을 적절하게 측정하는 문제가 여전히 남아 있으며 위와 같이 정확하게 수행 할 API가 없다고 생각합니다.