2010-10-15 16 views
17

Próbuję utworzyć tablicę o numerach byte o długości UInt32.MaxValue. Tablica ta jest zasadniczo małym (ish) w pamięci bazy danych:Maksymalna długość bajtu []?

byte[] countryCodes = new byte[UInt32.MaxValue]; 

Na moim komputerze, jednak w czasie wykonywania, dostaję System.OverflowException z „Arytmetyka operacja spowodowała przepełnienie”.

O co chodzi? Czy muszę użyć bloku unsafe i malloc? Jak to zrobić w C#?

+4

Nie miałem pojęcia, że ​​jest tak wiele krajów! – James

Odpowiedz

24

Obecna implementacja System.Array używa Int32 dla wszystkich wewnętrznych liczników itp., Więc teoretyczna maksymalna liczba elementów to Int32.MaxValue.

Istnieje również limit 2 GB na maksymalny obiekt narzucony przez Microsoft CLR.

Dobrym dyskusja i obejście tutaj ...

i kilkoma powiązanymi, nie-całkiem-duplikat, pytania i odpowiedzi tutaj ...

1

Nie zrobiłbym tego w pierwszej kolejności. Dlaczego miałbyś chcieć ustawić tę pamięć dla tej bazy danych w pamięci? Czy nie chciałbyś raczej struktury danych, której rozmiar wzrasta w miarę postępu (np. List<int>)? Lub (jeśli preferowane) użyj bazy danych w pamięci, takiej jak sqlite?

7

Na .NET 4.5 Maksymalna długość instantiatable tablicy bajtowej wynosi: 2147483591 lub 56 mniej niż int.MaxValue. Znalezione przez:

for (int i = int.MaxValue; i > 0; i--) 
{ 
    try 
    { 
     byte[] b = new byte[i]; 
     Console.Out.WriteLine("MaxValue: " + i); 
     Environment.Exit(0); 
    } 
    catch (Exception ignored) 
    {} 
} 
Powiązane problemy