Frage

Was ist die längste Zeichenfolge, die in .NET erstellt werden kann?Die Dokumente für die String Soweit ich sehen kann, schweigt die Klasse zu dieser Frage, sodass für eine verlässliche Antwort möglicherweise einige Kenntnisse der Interna erforderlich sind.Würde sich das Maximum auf einem 64-Bit-System ändern?

[Dies ist eher aus Neugier als aus praktischen Gründen gefragt – ich habe nicht vor, Code zu erstellen, der riesige Strings verwendet!]

War es hilfreich?

Lösung

Die theoretische Grenze sein kann 2147483647, aber die praktische Grenze ist bei weitem nicht das. Da kein einzelnes Objekt in einer .NET-Programm kann über 2 GB und der Typ Zeichenfolge verwendet Unicode (2 Bytes für jedes Zeichen), das Beste, was Sie tun können, ist 1073741823, aber Sie sind wahrscheinlich nicht immer in der Lage sein, die auf einem zuzuteilen 32-Bit-Maschine.

Dies ist eine jener Situationen, in denen "Wenn Sie fragen müssen, Sie ist wahrscheinlich etwas falsch zu machen. "

Andere Tipps

Aufgrund meines sehr wissenschaftlich und präzises Experiment, Tops es gut, bevor eine Milliarde Zeichen auf meinem Rechner aus. (Ich bin immer noch den Code unten läuft eine bessere Pinpoint zu bekommen).

UPDATE: Nach ein paar Stunden habe ich aufgegeben. Endgültige Ergebnisse:. Kann viel größer als 100 Millionen Zeichen gehen, sofort gegeben System.OutOfMemoryException bei 1,000,000,000 Zeichen

using System;
using System.Collections.Generic;

public class MyClass
{
    public static void Main()
    {
        int i = 100000000;
        try
        {
            for (i = i; i <= int.MaxValue; i += 5000)
            {
                string value = new string('x', i);
                //WL(i);
            }
        }
        catch (Exception exc)
        {
            WL(i);
            WL(exc);
        }
        WL(i);
        RL();
    }

    #region Helper methods

    private static void WL(object text, params object[] args)
    {
        Console.WriteLine(text.ToString(), args);   
    }

    private static void RL()
    {
        Console.ReadLine(); 
    }

    private static void Break() 
    {
        System.Diagnostics.Debugger.Break();
    }

    #endregion
}

Da die Length Eigenschaft System.String ein Int32 ist, würde ich vermuten, dass, dass die maximale Länge 2147483647 Zeichen sein würde (max Int32 Größe). Wenn es mehr erlaubt, könnten Sie nicht die Länge überprüfen, da dies fehlschlagen würde.

Für alle, spät zu diesem Thema kommen, könnte ich das hitscan sehen, „sollten Sie wahrscheinlich nicht tun“ könnte dazu führen, jemand zu fragen, was sie tun sollten ...

Die Stringbuilder Klasse ist oft ein einfacher Austausch. Betrachten Sie eine der stream-basierten Klassen vor allem, wenn Ihre Daten aus einer Datei kommen.

Das Problem mit s += "stuff" ist, dass es einen völlig neuen Bereich zuzuordnen ist, die Daten zu halten und dann alle alten Daten zu kopieren und die neuen Sachen - jede und jede Schleifeniterationslatenzzeit. Also, das Hinzufügen fünf Bytes bis 1.000.000 mit s += "stuff" ist extrem teuer. Wenn das, was wollen Sie ist nur fünf Bytes zu Ende schreiben und mit dem Programm fortfahren, müssen Sie eine Klasse auswählen, die etwas Raum für Wachstum läßt:

StringBuilder sb = new StringBuilder(5000);
for (; ; )
    {
        sb.Append("stuff");
    }

StringBuilder wird href="https://stackoverflow.com/questions/4495855/how-does-the-stringbuilder-decide-how-large-its-capacity-should-be"> Auto-wachsen durch eine Verdoppelung wenn es Limit ist getroffen wird. Also, werden Sie das Wachstum Schmerz sehen einmal am Anfang, einmal bei 5.000 Bytes, wieder bei 10.000, wieder bei 20.000. Anfügen Saiten wird der Schmerz jede Schleifeniterationslatenzzeit entstehen.

Die maximale Länge einer Zeichenfolge auf meiner Maschine ist 1073741791 .

Sie sehen, Strings werden nicht durch ganzzahlige beschränkt, wie allgemein angenommen wird.

Speicher Einschränkungen abgesehen, Strings können nicht mehr als 2 haben 30 ( 1073741824 ) Zeichen, da eine 2 GB Grenze wird durch die Microsoft CLR (Common Language Runtime) auferlegt. 33 mehr als mein Computer erlaubt.

Nun, hier ist etwas, das Sie willkommen sind, sich zu versuchen.

Erstellen

eine neue C # Konsolenanwendung in Visual Studio und dann Kopieren / Einfügen die Hauptmethode hier:

static void Main(string[] args)
{
    Console.WriteLine("String test, by Nicholas John Joseph Taylor");

    Console.WriteLine("\nTheoretically, C# should support a string of int.MaxValue, but we run out of memory before then.");

    Console.WriteLine("\nThis is a quickish test to narrow down results to find the max supported length of a string.");

    Console.WriteLine("\nThe test starts ...now:\n");

    int Length = 0;

    string s = "";

    int Increment = 1000000000; // We know that s string with the length of 1000000000 causes an out of memory exception.

    LoopPoint:

    // Make a string appendage the length of the value of Increment

    StringBuilder StringAppendage = new StringBuilder();

    for (int CharacterPosition = 0; CharacterPosition < Increment; CharacterPosition++)
    {
        StringAppendage.Append("0");

    }

    // Repeatedly append string appendage until an out of memory exception is thrown.

    try
    {
        if (Increment > 0)
            while (Length < int.MaxValue)
            {
                Length += Increment;

                s += StringAppendage.ToString(); // Append string appendage the length of the value of Increment

                Console.WriteLine("s.Length = " + s.Length + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm"));

            }

    }
    catch (OutOfMemoryException ex) // Note: Any other exception will crash the program.
    {
        Console.WriteLine("\n" + ex.Message + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ".");

        Length -= Increment;

        Increment /= 10;

        Console.WriteLine("After decimation, the value of Increment is " + Increment + ".");

    }
    catch (Exception ex2)
    {
        Console.WriteLine("\n" + ex2.Message + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ".");

        Console.WriteLine("Press a key to continue...");

        Console.ReadKey();

    }

    if (Increment > 0)
    {
        goto LoopPoint;

    }

    Console.WriteLine("Test complete.");

    Console.WriteLine("\nThe max length of a string is " + s.Length + ".");

    Console.WriteLine("\nPress any key to continue.");

    Console.ReadKey();

}

Meine Ergebnisse waren wie folgt:

  

String-Test, von Nicholas John Joseph Taylor

     

Theoretisch sollte C # eine Reihe von int.MaxValue unterstützen, aber wir laufen   aus dem Speicher vorher.

     

Dies ist ein quickish Tester zu verengen den max finden   unterstützte Länge eines Strings.

     

Der Test beginnt ... jetzt:

     

s.Length = 1000000000 bei 2019.08.05 12.06

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.06. Nach der Dezimierung, ist der Wert von Increment   100000000.

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.06. Nach der Dezimierung, ist der Wert von Increment   10000000 s.Length = 1010000000 am 2019.08.05 12.06 s.Length = 1020000000 am 2019.08.05 00.06 s.Length = 1030000000 am 2019.08.05   12.06 s.Length = 1040000000 bei 2019.08.05 12.06 s.Length = 1050000000   bei 2019.08.05 12.06 s.Length = 1060000000 bei 2019.08.05 00.06 s.Length   = 1070000000 bei 2019.08.05 00.06

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.06. Nach der Dezimierung, ist der Wert des Increment 1000000.   s.Length = 1071000000 bei 2019.08.05 12.06 s.Length = 1072000000 bei   2019.08.05 12.06 s.Length = 1073000000 bei 2019.08.05 00.06

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.06. Nach der Dezimierung, ist der Wert von Increment 100000.   s.Length = 1073100000 bei 2019.08.05 12.06 s.Length = 1073200000 bei   2019.08.05 12.06 s.Length = 1073300000 bei 2019.08.05 12.06 s.Length =   1073400000 bei 2019.08.05 00.06 s.Length = 1073500000 bei 2019.08.05   12.06 s.Length = 1073600000 bei 2019.08.05 12.06 s.Length = 1073700000   bei 2019.08.05 12.06

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.06. Nach der Dezimierung, ist der Wert des Increment 10000.   s.Length = 1073710000 bei 2019.08.05 12.06 s.Length = 1073720000 bei   2019.08.05 12.06 s.Length = 1073730000 bei 2019.08.05 12.06 s.Length =   1073740000 bei 2019.08.05 12.06

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.06. Nach der Dezimierung, ist der Wert des Schrittweite 1000 auf.   s.Length = 1073741000 bei 2019.08.05 12.06

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.06. Nach der Dezimierung, ist der Wert des Schrittweite 100.   s.Length = 1073741100 bei 2019.08.05 12.06 s.Length = 1073741200 bei   2019.08.05 12.06 s.Length = 1073741300 bei 2019.08.05 00.07 s.Length =   1073741400 bei 2019.08.05 00.07 s.Length = 1073741500 bei 2019.08.05   12.07 s.Length = 1073741600 bei 2019.08.05 12.07 s.Length = 1073741700   bei 2019.08.05 12.07

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.07. Nach der Dezimierung, ist der Wert des Schrittweite 10.   s.Length = 1073741710 bei 2019.08.05 12.07 s.Length = 1073741720 bei   2019.08.05 12.07 s.Length = 1073741730 bei 2019.08.05 12.07 s.Length =   1073741740 bei 2019.08.05 00.07 s.Length = 1073741750 bei 2019.08.05   12.07 s.Length = 1073741760 bei 2019.08.05 12.07 s.Length = 1073741770   bei 2019.08.05 12.07 s.Length = 1073741780 bei 2019.08.05 00.07 s.Length   = 1073741790 bei 2019.08.05 00.07

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.0512.07. Nach der Dezimierung, ist der Wert des Schrittweite 1.   s.Length = 1073741791 bei 2019.08.05 12.07

     

Ausnahme vom Typ ‚System.OutOfMemoryException‘ wurde ausgelöst. beim   2019.08.05 00.07. Nach Dezimierung, ist der Wert des Schrittweite 0-Test   abgeschlossen.

     

Die maximale Länge eines Strings ist 1073741791.

     

Drücken Sie eine beliebige Taste, um fortzufahren.

Die maximale Länge eines Strings auf meiner Maschine ist 1073741791.

Ich würde es sehr zu schätzen wissen, wenn die Menschen ihre Ergebnisse als Kommentar unten abgeben könnten.

Es wird interessant sein zu erfahren, wenn die Menschen die gleichen oder unterschiedliche Ergebnisse erhalten.

200 MB ... an welcher Stelle Ihre App mahlt zu praktisch zum Erliegen, hat über einen Gig Arbeitssatzspeicher und die o / s beginnt zu handeln, wie Sie neu starten müssen.

static void Main(string[] args)
{
    string s = "hello world";
    for(;;)
    {
        s = s + s.Substring(0, s.Length/10);
        Console.WriteLine(s.Length);
    }
}

12
13
14
15
16
17
18
...
158905664
174796230
192275853
211503438

Seit String.Length ist eine Ganzzahl (das ist ein Alias ​​für Int32), seine Größe ist begrenzt auf Int32.MaxValue Unicode-Zeichen.;-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top