Mam List<Matrix4>
, gdzie Matrix4
jest strukturą zawierającą 16 elementów pływających, więc używa 16 * 4 bajtów = 64 bajty.C# List Wyjątek pamięci, ale daleki od ograniczenia 2Gb
Kiedy zaczynam dodawać elementy do listy, generuję wyjątek braku pamięci po przekroczeniu 1 miliona wierszy.
wiem, że .NET posiada limit 2 GB za przedmiot, ale chyba jestem całkowicie z mojego umysłu:
1.000.000 * 64 bajtów = ~ 61mb
który nie jest nawet blisko do limitu.
Po rozpoczęciu zapełniania listy, zgodnie z menedżerem zadań, moja aplikacja używa 896 MB, a do czasu, gdy osiągnę wyjątek, używa 1028 MB.
Komputer ma 8 GB pamięci fizycznej, ale korzysta tylko z 6 GB.
Jakieś wskazówki, dlaczego tak się dzieje?
--- UPDATE ----
Zmiana cel platformy na x64 rozwiązać ten problem na osobnym projekcie badawczym. Niestety oryginalny projekt nie może być x64 z powodu odniesień do bibliotek DLL x86, które nie działają na x64. Ale to kolejny problem.
Nie myślałem o zmianie na x64, ponieważ wydawało się, że jest daleko od limitów pamięci, ale sądzę, że Hans Passant był tuż przy 122mb, będąc zbyt blisko limitu 1,3 Gb. Dziękuję wam wszystkim.
Nie jest to odpowiedź, ale nie można zliczyć takiej alokacji pamięci .NET. –
należy użyć narzędzia w Visual Studio do profilowania wykorzystania pamięci. https://msdn.microsoft.com/en-us/library/dn342825.aspx –
Nie sądzę, że to również odpowiedź. Ale każdy obiekt w .NET ma nagłówek z informacją. W aplikacji 32-bitowej nagłówek ma długość 8 bajtów, w aplikacji 64-bitowej nagłówek ma długość 16 bajtów. Tak więc, KAŻDY float zużywa 12 bitów długości (w aplikacji 32-bitowej). Bez widząc więcej kodu jest niemożliwe, o co chodzi. –