2009-11-29 3 views
6

바보 같은 질문이지만, winforms 응용 프로그램에서 현재 작업하고 있습니다. 나는 통계 목적으로 메모리에 보유 된 List<[SomeObject]>에 의해 할당되거나 사용 된 바이트의 양을 얻고 싶습니다. 이것이 가능한가? 가능한 옵션을 검색했지만 분명히 myList.GetTotalBytes() 메소드가 없습니다. 내가 런타임이 개체의 크기를 얻기의 신뢰할 수있는 프로그램 방법을 제공 확실하지 않다목록의 바이트 크기를 얻으십시오 <T>

답변

5

그러나 당신에게 열려있는 몇 가지 옵션이 있습니다 :

  • 사용 Marshal.SizeOf() (반환 CLR 프로파일 러와 같은 도구를 사용하여 개체의 관리되지 않는 크기)
  • 은 정말 당신이 무슨 뜻인지에 따라 달라집니다 근사치
+0

와우, 빠른 것이 었습니다! 감사 4 감사합니다! 불행히도, 런타임에 사용할 수있는 메소드를 찾고 있는데, 목록을 찢어 내고 각 객체를 반복하는 작업을 포함하지 않을 것입니다. – Shalan

+0

은 CLR 프로파일 러에 대한 언급을 놓쳤습니다. 이전에는 사용하지 않았지만, 그것을 사용해 주셔서 감사합니다. – Shalan

10

바이너리로 개체를 직렬화. 목록 자체에서 사용되는 바이트 수를 예측할 수 있습니다. 그러나 목록이 수집에 적합 해지면 가비지 수집에 적합한 바이트 수를 예측하는 것과 같지 않습니다. 목록

비트 :

  • 백킹 어레이 (T[] - 만리스트에 액세스 할 수있는 배열을 참조)
  • 크기는 (INT)
  • 싱크 루트 (기준)
  • 버전 번호 (INT) 까다로운 비트 카운트 얼마나 결정된다

. 이들 각각은 계산하기 쉽습니다 (특히 T가 참조 유형이라는 것을 알고있는 경우). 이라고 표시된의 수를 계산 하시겠습니까? 그 참조는 유일한 것입니까, 그렇지 않은 것입니까?

"통계 목적으로"알고 싶다고 말하면 더 정확 할 수 있습니까? 자신이 정말로 관심이있는 내용 (그리고 목록에있는 내용과 동일한 객체에 대한 다른 참조가있을 수 있는지에 대한 약간의 정보)을 말할 수 있다면 더 많은 도움을 줄 수 있습니다.

+0

안녕 존, 고맙습니다 4the 답장. 미안 4 분명하지 않다. 목록은 LINQ 쿼리에서 채워지는 테이블 엔터티 컬렉션입니다. 여기에는 주로 string 및 dateTime 유형이 포함됩니다. – Shalan

+0

"통계 목적으로"- 내 쿼리가 10,000 개의 Entity 개체가 포함 된 컬렉션을 생성한다고 가정하고 각 개체가 평균 25 바이트의 메모리를 차지하는 경우 모든 엔터티의 누적 바이트 합계 목록에있는 객체 – Shalan

+0

앞서 언급했듯이 객체를 반복하고 각 속성을 드릴 다운하는 대안을 찾고 있습니다. Jan – Shalan

4

이것은 완전한 말일지도 모르는 대답 일 수도 있지만, 나는 사지에 나가서 통계 비교를한다면 이진수를 MemoryStream으로 serialize 한 다음 등의 Length 재산보고 :이 프레임 워크의 다른 버전 사이에서 변경할 수 있으며, 단 하나의 프로그램 내에서 객체 그래프 사이의 비교를 위해 유용 할 것이라고

List<string> list = new List<string> 
    { 
     "This", 
     "is", 
     "a", 
     "test" 
    }; 

    using (Stream stream = new MemoryStream()) 
    { 
     IFormatter formatter = new BinaryFormatter(); 

     formatter.Serialize(stream, list); 
     Console.WriteLine(stream.Length); 
    } 

를 적어 둡니다을.

관련 문제