Question

Quelle est la plus longue chaîne pouvant être créée dans .NET? La documentation de la classe String ne dit rien sur cette question. Une réponse faisant autorité pourrait donc nécessiter une certaine connaissance des éléments internes. Le maximum de changement sur un système 64 bits?

[On demande plus de curiosité que d'utilisation pratique - je n'ai pas l'intention de créer un code utilisant des chaînes gigantesques!]

Était-ce utile?

La solution

La limite théorique peut être de 2 147 483 647, mais la limite pratique est loin de celle. Dans la mesure où aucun objet dans un programme .NET ne dépasse 2 Go et que le type de chaîne utilise Unicode (2 octets pour chaque caractère), la meilleure solution est de 1 073 741 823, mais vous ne serez probablement pas en mesure de l'allouer de cette manière. Ordinateur 32 bits.

C’est l’une des situations dans lesquelles " Si vous devez demander, vous faites probablement quelque chose de mal. "

Autres conseils

Sur la base de mon expérience hautement scientifique et précise, cette image figure sur une machine bien avant un million de caractères. (Je lance toujours le code ci-dessous pour obtenir un meilleur pinpoint).

MISE À JOUR: Après quelques heures, j'ai abandonné. Résultats finaux: plus de 100 000 000 caractères peuvent être utilisés, en attribuant instantanément System.OutOfMemoryException à 1 000 000 000 de caractères.

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
}

Comme la propriété Length de System.String est un Int32 , je suppose que la longueur maximale serait de 2 147 483 647 caractères Int32 taille). Si cela vous permettait plus longtemps, vous ne pourriez pas vérifier la longueur car cela échouerait.

Pour tous ceux qui arrivent tard sur ce sujet, je me suis rendu compte que "vous ne devriez probablement pas faire cela". peut amener quelqu'un à demander ce qu'il devrait faire & # 8230;

Le StringBuilder la classe est souvent un remplacement facile. Prenez l’une des classes basées sur des flux . surtout si vos données proviennent d’un fichier.

Le problème avec s + = "& substance; " " est qu'il doit attribuer une nouvelle zone pour stocker les données, puis copier toutes les anciennes données plus le nouveau, EACH. ET CHAQUE BOUCLE ITERATION. Ainsi, ajouter cinq octets à 1 000 000 avec s + = "articles" est extrêmement coûteux. Si vous voulez simplement écrire cinq octets jusqu'à la fin et poursuivre votre programme, vous devez choisir une classe qui laisse une certaine marge de croissance:

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

StringBuilder sera croître automatiquement en doublant lorsque la limite est atteinte. Ainsi, vous verrez la douleur de la croissance une fois au début, une fois à 5 000 octets, à nouveau à 10 000, à nouveau à 20 000. Ajouter des chaînes entraînera la douleur à chaque itération de la boucle.

La longueur maximale d'une chaîne sur ma machine est 1 073 741 791 .

Vous voyez, les chaînes ne sont pas limitées par un entier, comme on le croit généralement.

En dehors des restrictions de mémoire, les chaînes ne peuvent comporter plus de 2 30 ( 1 073 741 824 ), une limite de 2 Go étant imposée par le Microsoft CLR (Common Language Runtime). 33 de plus que mon ordinateur ne le permet.

Maintenant, voici quelque chose que vous pouvez essayer vous-même.

Créez une nouvelle application de console C # dans Visual Studio, puis copiez / collez la méthode principale ici:

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();

}

Mes résultats sont les suivants:

  

Test de la corde, par Nicholas John Joseph Taylor

     

Théoriquement, C # devrait supporter une chaîne de int.MaxValue, mais nous courons   mémoire insuffisante avant.

     

Ceci est un test rapide pour affiner les résultats et trouver le maximum   longueur prise en charge d'une chaîne.

     

Le test commence ... maintenant:

     

à la longueur = 1000000000 le 08/05/2019 12:06

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:06. Après décimation, la valeur de Increment est   100000000.

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:06. Après décimation, la valeur de Increment est   10000000. s.Longueur = 1010000000 au 08/05/2019 12:06 s.Long = 1020000000 au 08/05/2019 12:06 s.Long = 1030000000 au 08/05/2019   12:06 s.Length = 1040000000 au 08/05/2019 12:06 s.Length = 1050000000   au 08/05/2019 12:06 à la longueur = 1060000000 au 08/05/2019 à 12:06 à la longueur   = 1070000000 au 08/05/2019 12:06

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:06. Après décimation, la valeur de Increment est de 1000000.   longueur = 1071000000 au 08/05/2019 12:06 longueur = 1072000000 à   08/05/2019 12:06 s.Length = 1073000000 au 08/05/2019 12:06

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:06. Après décimation, la valeur de Incrément est 100000.   Longueur = 1073100000 au 08/05/2019 12:06 Longueur = 1073200000 à   08/05/2019 12:06 s.Length = 1073300000 au 08/05/2019 12:06 s.Length =   1073400000 au 08/05/2019 12:06 s.Length = 1073500000 au 08/05/2019   12:06 à la longueur = 1073600000 au 08/05/2019 12:06 à la longueur = 1073700000   au 08/05/2019 12:06

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:06. Après décimation, la valeur de l’incrément est 10000.   à la longueur = 1073710000 au 08/05/2019 12:06 à la longueur = 1073720000 à   08/05/2019 12:06 s.Length = 1073730000 au 08/05/2019 12:06 s.Length =   1073740000 au 08/05/2019 12:06

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:06. Après décimation, la valeur de Incrément est 1000.   longueur = 1073741000 au 08/05/2019 12:06

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:06. Après décimation, la valeur de Incrément est 100.   longueur = 1073741100 au 08/05/2019 12:06 longueur = 1073741200 à   08/05/2019 12:06 s.Length = 1073741300 au 08/05/2019 12:07 s.Length =   1073741400 au 08/05/2019 12:07 s.Length = 1073741500 au 08/05/2019   12:07 à la longueur = 1073741600 au 08/05/2019 12:07 à la longueur = 1073741700   au 08/05/2019 12:07

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:07. Après décimation, la valeur de Incrément est 10.   Longueur = 1073741710 au 08/05/2019 12:07 Longueur = 1073741720 à   08/05/2019 12:07 s.Length = 1073741730 au 08/05/2019 12:07 s.Length =   1073741740 au 08/05/2019 12:07 s.Length = 1073741750 au 08/05/2019   12:07 à la longueur = 1073741760 au 08/05/2019 12:07 à la longueur = 1073741770   au 08/05/2019 12:07 à la longueur = 1073741780 au 08/05/2019 12:07 à la longueur   = 1073741790 au 08/05/2019 12:07

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:07. Après décimation, la valeur de Incrément est 1.   Longueur = 1073741791 au 08/05/2019 12:07

     

Une exception de type 'System.OutOfMemoryException' a été levée. à   08/05/2019 12:07. Après décimation, la valeur de Incrément est 0. Test   complète.

     

La longueur maximale d'une chaîne est 1073741791.

     

Appuyez sur n’importe quelle touche pour continuer.

La longueur maximale d'une chaîne sur ma machine est de 1073741791.

J'apprécierais beaucoup que les gens publient leurs résultats sous forme de commentaire ci-dessous.

Il sera intéressant de savoir si les gens obtiennent les mêmes résultats ou des résultats différents.

200 Mo ... à quel point votre application est bloquée virtuellement, a environ un gig de travail, et le système d'exploitation commence à agir comme si vous deviez redémarrer.

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

Puisque String.Length est un entier (c'est-à-dire un alias pour Int32 ), sa taille est limitée à Int32.MaxValue caractères unicode . ; -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top