2010-10-12 9 views
8

Potrzebuję załadować duże ilości bitmap do pamięci do wyświetlania w aplikacji WPF (przy użyciu .net 4.0). Tam, gdzie napotykam problemy, kiedy zbliżam się do około 1400 MB pamięci (otrzymuję to z listy procesów w menedżerze zadań).Wyjątek wyjątków w pamięci WPF podczas ładowania dużej ilości bitmap w pojedynczym wystąpieniu aplikacji. Czy istnieje limit?

To samo dzieje się niezależnie od tego, czy aplikacja jest uruchamiana na komputerze z 4 GB pamięci lub 6 GB (i innych konfiguracji, na których nie mam danych). Łatwo jest przetestować, zmniejszając załadowane obrazy i gdy działa na 1 komputerze, wtedy działa na nich wszystkich, ale gdy zawiesza się na jednym, to również działa na wszystkich.

Gdy zmniejszam liczbę obrazów i zezwalam aplikacji na ładowanie bez powodowania wyjątku pamięci, mogę uruchomić wiele wystąpień aplikacji (przekraczając 1,4 GB pojedynczej instancji) bez problemu, więc wydaje się, że jest ich kilka na instancję błąd limitu lub wystąpienia błędu z mojej strony.

załadować obrazów jak BitmapImage i są przechowywane albo w List<BitmapImage> lub załadować do List<byte[]> gdzie są następnie używane w pęczku warstwowych sekwencji (przy użyciu Writeablebitmap)

Błąd occurrs kiedy ładunek obrazy nie są w użyciu. W powtarzalnym przypadku ładuję obrazy 600 640X640 i kolejne 200-300 mniejszych obrazów od 100X100 do 200X200, chociaż wydaje się, że jest to ogólna liczba bitów.

Więc moje pytania to:

* Czy jest jakiś wbudowany na ograniczenia pamięci procesu w takiej sytuacji?

* Czy istnieje lepsza technika ładowania dużej ilości danych obrazu do pamięci?

Dzięki, Brian

+1

Czy używasz 32- lub 64-bitowej aplikacji i systemu operacyjnego? –

+0

Mam 64-bitowy system Windows 7 i kompiluję dla 'x86' - uwaga wcześniej wstawiłem "dowolny procesor", ale x86 jest formatem kompilacji – Brian

Odpowiedz

11

Tak, istnieje limit na alokacji pamięci na proces. Jednym z rozwiązań jest sprawienie, aby twój binarny LARGEADDRESSAWARE zużył więcej pamięci.

Odwołaj się do Out of memory? Easy ways to increase the memory available to your program, ma świetną dyskusję na temat rozwiązań tego problemu.

+0

Dzięki, to rozwiązanie rozwiązało problem. Miałem ten sam limit 1,4GB, o czym wspomina artykuł. Teraz jestem blisko 2 GB bez problemu używając ustawienia LARGEADDRESSAWARE. – Brian

3

Poniżej mogą być powodem, ale nie jestem pewien

Problem nie polega na załadowaniu dużej amout danych, ale ponieważ CLR utrzymuje Duże sterty dla obiektu większa niż 85k pamięci i nie masz żadnej kontroli, aby uwolnić tę dużą stertę.

i te obiekty stały się Długo aktywne i zwykle są zwalniane, gdy Appdomain zwalnia.

Proponuję, aby spróbować załadować większe obrazy w innym AppDomain i użyć tej aplikacji do powiększania większych zdjęć.

See this MSDN Entry to Profiling GC

See if Memory Mapped Files helps in case you are using .net 4.0

And more example

+0

Zgadzam się. Wydaje się, że problem z fragmentacją pamięci. – Nayan

1

Wzrost stanu x 86 może uzyskać dostęp do 4 GB w 64-bitowym Windows, tak że jest teoretyczna górna granica dla procesu. To wymaga, aby aplikacja była large address aware. Ponadto .NET nakłada limit 2 GB na pojedynczy obiekt.

Być może cierpisz z powodu fragmentacji LOH. Obiekty większe niż 85000 bajtów są przechowywane na stertach dużego obiektu, który jest specjalną częścią sterowanej sterty, która nie jest kompaktowana.

Mówisz, że obrazy mają rozmiar 600 x 600, ale jaki jest format pikseli i czy jest tam również maska?Jeśli używasz bajt na kanał koloru plus bajt dla kanału alfa, każde zdjęcie ma rozmiar 600x600x32, więc próba załadowania 600 z nich naraz będzie problemem w procesie 32-bitowym.

+1

Brian, czy możesz podać dowolny link MSDN, który stwierdza, że ​​".NET nakłada limit 2 GB na pojedynczy obiekt"? Dzięki! – Nayan

+0

Mam to. http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx – Nayan

+0

Podobne pytanie http://stackoverflow.com/q/1087982/38206 –

0

Występują ograniczenia 32-bitowych procesów, które mogą uzyskać dostęp tylko około 2 GB danych. Jeśli miałbyś uruchomić 64-bitowy, nie miałbyś problemów. Istnieje wiele sposobów, aby obejść ten problem, z których niektóre są:

  • prostu nie załadować że wiele danych, gdy są potrzebne tylko obciążenie. Użyj buforowania.
  • Skorzystaj z plików mapowanych na pamięć, aby odwzorować całe uchwyty danych w pamięci. Niezalecane, ponieważ będziesz musiał samodzielnie zarządzać pamięcią.
  • Stosować kilka procesów do przechowywania danych i wykorzystania mechanizmu IPC przynieść tylko na potrzebnych danych, podobnym do pozycji 1.
Powiązane problemy