Was ist die maximal mögliche Länge einer .NETTO-string?
Was ist die längste Zeichenfolge, die erstellt werden können .NET? Die docs für die String
Klasse schweigt zu dieser Frage, soweit ich das sehen kann, also eine verbindliche Antwort kann erfordern einige Kenntnisse der Interna. Würde die maximale änderung auf einem 64-bit system?
[Dies ist gefragt, mehr aus Neugier, als für den praktischen Gebrauch - ich beabsichtige nicht, erstellen Sie code, der verwendet, gigantischen Streicher!]
InformationsquelleAutor der Frage McKenzieG1 | 2008-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die theoretische Grenze kann 2.147.483.647, sondern die praktische Beschränkung ist nirgendwo in der Nähe. Da kein einzelnes Objekt in einem .Net-Programm kann über 2 GB und der string-Typ verwendet unicode (2 bytes für jedes Zeichen), die beste Sie tun könnten, ist 1,073,741,823, aber du bist wahrscheinlich nicht immer in der Lage sein, zu reservieren, die auf einem 32-bit-Maschine.
Dies ist eine jener Situationen, in denen "Wenn Sie Fragen haben, sind Sie wahrscheinlich etwas falsch machen."
InformationsquelleAutor der Antwort HitScan
Basierend auf meinen hoch wissenschaftliche und genaue Experimentieren, es geht auf meinem Rechner auch vor 1,000,000,000 Zeichen. (Ich bin noch läuft der code unten, um besser lokalisieren).
UPDATE:
Nach ein paar Stunden habe ich aufgegeben. Endgültige Ergebnisse: gehen Können, viel größer als 100.000.000 Zeichen, sofort gegeben
System.OutOfMemoryException
bei 1,000,000,000 Zeichen.InformationsquelleAutor der Antwort bdukes
Da die
Length
Eigenschaft vonSystem.String
ist einInt32
ich würde vermuten, dass, dass die maximale Länge würde 2.147.483.647 Zeichen (maxInt32
Größe). Wenn es erlaubt mehr konnten Sie nicht prüfen Sie die Länge, da würde scheitern.InformationsquelleAutor der Antwort Ryan Farley
Für jemand kommen, um dieses Thema zu spät, ich konnte sehen, dass hitscan", die Sie wahrscheinlich nicht tun sollten," könnte jemanden dazu bringen zu Fragen, was Sie tun sollten...
Den StringBuilder Klasse ist oft eine einfache Ersatz.
Sollten Sie eines der stream-basierte Klassen vor allem, wenn Ihre Daten kommen aus einer Datei.
Das problem mit
s += "stuff"
ist, dass es zuordnen muss einen komplett neuen Bereich zu halten, die Daten und kopieren Sie dann alle alten Daten plus die neuen Sachen - JEDER LOOP-ITERATION. So, das hinzufügen von fünf bytes zu 1.000.000 mits += "stuff"
ist extrem teuer.Wenn das, was Sie wollen, ist zu einfach Schreibe fünf bytes an das Ende und fahren Sie mit Ihrem Programm, Sie müssen wählen Sie eine Klasse, die Spielraum für Wachstum:
StringBuilder
wird auto-wachsen durch Verdopplungwenn es das limit erreicht ist. Also, werden Sie sehen, das Wachstum, Schmerzen einmal beim start, einmal bei 5.000 bytes, wieder bei 10.000, wieder bei 20.000. Anhängen von strings entstehen der Schmerzen in jeder loop-iteration.InformationsquelleAutor der Antwort user922020
Streicher beschränken sich nicht nur durch die ganze Zahl als allgemein angenommen.
Speicher Einschränkungen beiseite, die Saiten können nicht mehr als 230 (1,073,741,824) Zeichen, da eine 2GB Grenze, die von den Microsoft-CLR (Common Language Runtime).
Hoffentlich, dies kann sich in Zukunft ändern.
InformationsquelleAutor der Antwort Knickerless-Noggins
200 MB... an welchem Punkt Ihrer app schleift Sie zu einem virtuellen Stillstand, verfügt über ein Konzert working set-Speicher, und die o/s beginnt zu handeln, wie Sie brauchen, um neu zu Booten.
InformationsquelleAutor der Antwort loudej
Seit
String.Length
ist eine ganze Zahl (das ist ein alias fürInt32
), seine Größe ist beschränkt aufInt32.MaxValue
unicode-Zeichen. 😉InformationsquelleAutor der Antwort VVS