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?
Dlaczego słowniki ze wszystkich rzeczy? Czy poszarpana tablica nie byłaby bardziej odpowiednia? – Luaan
@ Losowy losowy wybór, byłem w nastroju do słownika ... –
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