Какова максимально возможная длина a.NET струна?
Какова самая длинная строка, которая может быть создана в .NET? документы для String
класс молчит по этому вопросу, насколько я могу видеть, поэтому авторитетный ответ может потребовать некоторого знания внутренних органов. Будет ли Максимальное изменение в 64-разрядной системе?
[это больше для любопытства, чем для практического использования - я не собираюсь создавать код, который использует гигантские строки!]
7 ответов:
Это одна из тех ситуаций, где "Если вы должны спросить, вы, вероятно, делаете что-то неправильно."
основанный на моем сильно научном и точном эксперименте, оно покрывает вне на моей машине задолго до 1,000,000,000 характеров. (Я все еще запускаю код ниже, чтобы получить более точную точку).
обновление: Через несколько часов я сдался. Окончательные результаты: может пойти намного больше, чем 100,000,000 символов, мгновенно учитывая
System.OutOfMemoryException
в 1,000,000,000 символов.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 }
С
Length
собственностьSystem.String
этоInt32
, Я бы предположил, что максимальная длина будет 2,147,483,647 символов (maxInt32
размер). Если бы это позволяло дольше, вы не могли бы проверить длину, так как это не удалось бы.
для тех, кто приходит к этой теме поздно, я мог видеть, что hitscan "вы, вероятно, не должны этого делать" может заставить кого-то спросить, что они должны делать...
The StringBuilder класс часто легкая замена. Рассмотрим один из потоковые классы особенно, если ваши данные поступают из файла.
проблема с
s += "stuff"
это то, что он должен выделить совершенно новую область для хранения данных, а затем скопировать все старые данные в нее плюс новый материал-каждая итерация цикла. Итак, добавление пяти байтов к 1,000,000 сs += "stuff"
это очень дорого. Если вы хотите просто написать пять байтов до конца и продолжить свою программу, вы должны выбрать класс, который оставляет некоторое пространство для роста:StringBuilder sb = new StringBuilder(5000); for (; ; ) { sb.Append("stuff"); }
StringBuilder
будет автоматический рост за счет удвоения когда лимит превышен. Таким образом, вы увидите боль роста один раз при запуске, один раз на 5 000 байт, снова на 10 000, Снова на 20 000. Добавление строк будет понести боль каждую итерацию цикла.
строки не ограничены целым числом, как принято считать.
ограничения памяти в сторону, строки не могут иметь более 230 (1,073,741,824) символов, так как ограничение 2 ГБ накладывается Microsoft CLR (Common Language Runtime).
надеюсь, это может измениться в будущем.
200 мегов... в этот момент ваше приложение измельчается до виртуальной остановки, имеет около гигабайта рабочей памяти, и o/s начинает действовать так, как вам нужно будет перезагрузиться.
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