.net i limit pamięci

0

Witam!

Tworzę program rozwiązujący "piętnastkę" (fifteen puzzle) za pomocą dfs'a i bfs'a. Obmyśliłem że zamiast marnować miejsce w pamięci na drzewo będę przechowywał tylko odwiedzone stany w postaci listy liczb uint64. I tu się pojawia problem. Mogę wrzucić do listy maksymalnie ok 67 milionów stanów (512MB) - może się okazać za mało. Powyżej tej ilości wyrzuca OutOfMemoryException. System 32 bitowy, 3GB ramu, wolnego miejsca w ramie jest jeszcze od groma. Na mocniejszym komputerze (też 32 bitowy) taki sam efekt. Próbowałem rozłożyć to na kilka list - efekt ten sam - 512MB zallokowane i koniec. Wiem że istnieje limit 2GB dla pojedyńczego procesu, ale przecież jestem od tego limitu daleko. W javie istnieje podobne ograniczenie które można ominąć za pomocą parametru -Xmx[rozmiar]m.

Istnieje jakiś sposób na ominięcie tego problemu? Wielkie dzięki za wszelką pomoc.

EDIT:
Udało mi się ominąć problem. Okazało się że nie wykorzystuję nawet 20mb pamięci...
Ale tak na przyszłość pytanie pozostawiam aktualne.

1
  List<ulong> lista = new List<ulong>();
  for (ulong x = 0;x<70000000; x++)
    lista.Add(x);

To się rzeczywiście wywala przy 512 megabajtach — jednak bierz pod uwagę, że dodawanie pojedynczych elementów powoduje od czasu do czasu relokację całej listy do większego obszaru pamięci. Stary obszar podlega odśmiecaniu, ale najwyraźniej w pewnym momencie to nie wystarcza, i trafia się moment gdy brakuje już ciągłego wolnego obszaru o potrzebnym rozmiarze.

Możesz podać rozmiar docelowy listy, by uniknąć późniejszych relokacji:

  List<ulong> lista = new List<ulong>(180000000);
  for (ulong x = 0;x<180000000; x++)
    lista.Add(x);
  Console.WriteLine(lista.Count);

u mnie wystarcza na jakieś 180 milionów elementów, co daje 1,3 GB (komp ma 3 giga RAM-u)

Lista to po prostu kiepski pomysł na trzymanie tak dużej ilości pamięci.

1

Lista to po prostu kiepski pomysł na trzymanie tak dużej ilości pamięci. - Czemu? W C# List ma implementację tablicową (o czym zresztą wiesz bo napisałeś o realokacji pamięci) - Wychodzi na to samo jakby użyć tablicy z dodatkowym intem przechowującym ilość elementów.

0

Wykorzystałem tablicę hashy - okazała się znacznie szybsza w przeszukiwaniu. Dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1