Ponieważ ramy jednostka przechowuje dane w pamięci (jak wielu ORM użytkownika), a następnie jak w wielu kolekcjach w pamięci prawdopodobnie istnieją tablice wewnętrzne. Gdy dodajesz elementy do kolekcji, wewnętrzna tablica zwiększa się dwukrotnie.
Na przykład, jeśli posiadasz kolekcję taką, jak ArrayList zawierającą 256 elementów i dodajesz do niej 257 pozycję, to co się dzieje wewnętrznie, nowy blok pamięci jest przydzielany dla tablicy 512 elementów, to jest 256 elementów tablicy skopiowane do nowej tablicy 512 elementów, a następnie udostępniona zostanie tablica 256 elementów do usuwania śmieci. Tak więc w momencie przejścia będziesz mieć 768 elementów przydzielonych do pamięci tylko dlatego, że dodałeś 257. przedmiot. Wpadłem w bóle głowy, kiedy używam memorystreamu, ponieważ potrzebujesz prawie 3 razy więcej nieporuszonej pamięci niż to, czego naprawdę potrzebujesz. Jest to właściwość .Capacity widoczna w kolekcjach, a prawie zawsze ma ona moc 2 (ponieważ w razie potrzeby dwukrotnie się zwiększa).
Mój zakład jest tam są tablice wewnętrzne że podwójne wielkości ile potrzeba, aby wesprzeć swoje zbiory w obiektach pamięci. Tak więc 300 000 obiektów tego samego rodzaju prawdopodobnie zostałoby przetrzymane w wewnętrznej tablicy o rozmiarze 524,288. Dodatkowo, jeśli jest podobny do podobnych technik w innym miejscu w .NEt Framework, to za każdym razem, gdy dodano 262145 element, zarówno tablica 262144 jak i 524288 istniała w pamięci, podczas gdy elementy zostały skopiowane do nowej tablicy. Łącznie 786432 elementów w pamięci. Stara tablica będzie się trzymać, dopóki śmieciarz nie zdecyduje, że nie jest już potrzebna.
W strukturze Entity mogą występować pewne opcje dotyczące obsługi współbieżności, które można wyłączyć, co może poprawić wykorzystanie pamięci. Spekuluję tylko tutaj, ale aby obsługiwać współbieżność, przechowują w pamięci zarówno bieżącą wersję danych, jak i jej oryginalną wersję do porównania z obsługą współbieżności.
Chciałbym również spojrzeć na filtrowanie jakie dane są interakcji z. Spróbuj znaleźć sprytne kryteria, aby ograniczyć to, co jest pytaniem i załadowane do pamięci. Na przykład, jeśli masz aplikację, która pozwoliła użytkownikowi edytować konta klientów, ale tylko niektóre konta zostały do nich przypisane, użyj jej jako kryteriów filtrowania, aby załadować tylko do pamięci te konta, z którymi użytkownik mógłby potencjalnie wchodzić.