Jaki jest najdłuższy ciąg, który można utworzyć w .NET? Dokumenty dla String
klasy milczą na temat tego pytania, o ile widzę, więc autorytatywna odpowiedź może wymagać pewnej wiedzy na temat elementów wewnętrznych. Czy maksymalna zmiana miałaby miejsce w systemie 64-bitowym?
[To wymaga więcej ciekawości niż praktycznego zastosowania - nie zamierzam tworzyć żadnego kodu, który używa gigantycznych ciągów!]
byte[]
.Opierając się na moim bardzo naukowym i dokładnym eksperymencie, osiąga szczyt na mojej maszynie na długo przed 1 000 000 000 znaków. (Nadal korzystam z poniższego kodu, aby uzyskać lepsze wskazanie).
AKTUALIZACJA: Po kilku godzinach poddałem się. Ostateczne wyniki: Może przejść o wiele więcej niż 100 000 000 znaków, natychmiast podane
System.OutOfMemoryException
przy 1 000 000 000 znaków.źródło
Ponieważ
Length
właściwośćSystem.String
toInt32
, zgaduję, że maksymalna długość to 2 147 483 647 znaków (maksymalnyInt32
rozmiar). Jeśli to pozwoliło dłużej, nie można sprawdzić długości, ponieważ to się nie powiedzie.źródło
LongLength
a a strumień zastosowańlong
jak długość. Chociaż jest to poprawna odpowiedź, jest to dokładny sposób na zmierzenie tego.Dla każdego, kto spóźnia się na ten temat, widziałem, że hitcan „prawdopodobnie nie powinieneś tego robić” może sprawić, że ktoś zapyta, co powinien zrobić…
StringBuilder klasy często jest łatwa wymiana. Rozważ jedną z klas opartych na strumieniu, szczególnie jeśli dane pochodzą z pliku.
Problem
s += "stuff"
polega na tym, że musi on przydzielić całkowicie nowy obszar do przechowywania danych, a następnie skopiować do niego wszystkie stare dane oraz nowe elementy - KAŻDĄ I KAŻDĄ POZYCJĘ PĘTLI. Tak więc dodanie pięciu bajtów do 1 000 000 za pomocąs += "stuff"
jest niezwykle kosztowne. Jeśli chcesz po prostu napisać do końca pięć bajtów i kontynuować program, musisz wybrać klasę, która pozostawia trochę miejsca na rozwój:StringBuilder
wzrośnie automatycznie, podwajając, gdy limit zostanie przekroczony. Tak więc zobaczysz ból wzrostu raz na początku, raz przy 5000 bajtów, ponownie przy 10.000, ponownie przy 20.000. Dołączanie łańcuchów spowoduje ból przy każdej iteracji pętli.źródło
Maksymalna długość łańcucha na mojej maszynie to 1 073,741,791 .
Widzisz, ciągi nie są ograniczone liczbą całkowitą, jak się powszechnie uważa.
Pomijając ograniczenia pamięci, ciągi nie mogą mieć więcej niż 2 30 ( 1 073 741 824 ) znaków, ponieważ Microsoft CLR (Common Language Runtime) narzuca ograniczenie 2 GB. 33 więcej niż mój komputer jest dozwolony.
Oto coś, co możesz spróbować samemu.
Utwórz nową aplikację konsoli C # w Visual Studio, a następnie skopiuj / wklej główną metodę tutaj:
Moje wyniki były następujące:
Maksymalna długość łańcucha na mojej maszynie to 1073741791.
Byłbym bardzo wdzięczny, gdyby ludzie mogli opublikować swoje wyniki jako komentarz poniżej.
Ciekawie będzie się dowiedzieć, czy ludzie uzyskają takie same lub różne wyniki.
źródło
200 megs ... w tym momencie aplikacja zatrzymuje się wirtualnie, ma około gigabajt pamięci operacyjnej, a system operacyjny zaczyna działać tak, jakbyś musiał zrestartować komputer.
źródło
Ponieważ
String.Length
jest liczbą całkowitą (to jest aliasInt32
), jej rozmiar jest ograniczony doInt32.MaxValue
znaków Unicode. ;-)źródło