2015-06-18 8 views
5

W moim dążeniu do liczb pierwszych, już zadał to pytanie: Can't create huge arrays który doprowadzi mnie do tworzenia moje własne klasy fałszywych tablic na podstawie słownika tablic ...: private Dictionary<int, Array> arrays = new Dictionary<int, Array>();Tworzenie ogromną słownika

mogę wie tworzyć fałszywe tablice dużo bool (jak 10 000 000 000) przy użyciu kodu poniżej:

public class CustomArray 
{ 
    private Dictionary<int, Array> arrays = new Dictionary<int, Array>(); 

    public CustomArray(ulong lenght) 
    { 
     int i = 0; 
     while (lenght > 0x7FFFFFC7) 
     { 
      lenght -= 0x7FFFFFC7; 
      arrays[i] = new bool[0x7FFFFFC7]; 
      i++; 
     } 
     arrays[i] = new bool[lenght]; 
    } 
} 

Ale to wywala jak tylko poprosić o CustomArray z 100 000 000 000 elementów. Działa dobrze dla 25 pierwszych iteracji (mój słownik zawiera 25 tablic elementów 0x7FFFFFC7), ale potem zawiesza się z wyjątkiem wyjątku OutOfMemory.

W pozostałej części, mam pamięć 16GB, VS2013, program jest skompilowany w 64bits, mam włączone opcję gcAllowVeryLargeObjects i nie widzę żadnego szczyt pamięci w Menedżerze zadań.


Jak mogę uniknąć tego błędu?

+0

Dlaczego słowniki ze wszystkich rzeczy? Czy poszarpana tablica nie byłaby bardziej odpowiednia? – Luaan

+0

@ Losowy losowy wybór, byłem w nastroju do słownika ... –

+3

również bool nie jest wydajnym typem do przechowywania informacji. Możesz po prostu zapisać 64 jednostki w ulongu (8 bajtów) zamiast w 64-bitowej tablicy (64 bajty). – Andrew

Odpowiedz

7

100000000000 booli oznacza ~ 93 GB pamięci. Masz tylko @ 50 GB (w tym domyślną przydzieloną pamięć wirtualną).

Przechowywanie ich jako bitów (nie jako bajtów), spowodowałoby spadek do ~ 12 GB.

Spójrz na System.Collection.BitArray

+0

To wygląda dobrze - przetestuję to –

Powiązane problemy