답변:
이론적 한계는 2,147,483,647 일 수 있지만 실제 한계는 그 근처에 없습니다. .NET 프로그램의 단일 객체가 2GB를 초과하지 않고 문자열 유형이 UTF-16 (각 문자 당 2 바이트)을 사용하므로 1,073,741,823을 할 수있는 최선의 방법이지만 할당 할 수는 없습니다. 32 비트 시스템에서.
이것은 "당신이 물어봐야한다면 아마도 뭔가 잘못하고있는 것" 중 하나입니다 .
byte[]
도 참조하십시오 .
고도로 과학적이고 정확한 실험을 바탕으로 1,000,000,000 문자보다 훨씬 앞서 내 컴퓨터에서 완성됩니다. (나는 여전히 더 나은 핀 포인트를 얻기 위해 아래 코드를 실행하고 있습니다).
업데이트 :
몇 시간 후, 나는 포기했습니다. 최종 결과 : System.OutOfMemoryException
1,000,000,000 자로 즉시 100,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 자 (최대 Int32
크기)라고 생각합니다. 그것이 더 길어지면 길이를 확인할 수 없었습니다.
LongLength
도 마찬가지이며 스트림은 long
길이로 사용 됩니다. 올바른 답변이지만 이것을 측정하는 정확한 방법은 없습니다.
이 주제에 대해 늦게 와서 누군가에게, 나는 hitscan의 "아마도 그렇게하지 말아야 할 것"이 누군가가 무엇을해야하는지 물어볼 수 있다는 것을 알 수 있었다.
의 StringBuilder 클래스는 종종 쉽게 교체입니다. 스트림 기반 클래스 중 하나를 고려하십시오.데이터가 파일에서 오는 경우 특히 하십시오.
문제 s += "stuff"
는 데이터를 보유하기 위해 완전히 새로운 영역을 할당 한 다음 모든 이전 데이터를 새 데이터와 함께 복사합니다. 각각 및 모든 루프 반복. 따라서 1,000,000에 5 바이트를 추가하면 s += "stuff"
비용이 매우 많이 듭니다. 원하는 바를 5 바이트 만 작성하고 프로그램을 계속 진행하려면 성장할 여지를 남겨둔 클래스를 선택해야합니다.
StringBuilder sb = new StringBuilder(5000);
for (; ; )
{
sb.Append("stuff");
}
StringBuilder
것입니다 배로 자동 증가 그것의 한계는 히트 때. 따라서 시작시 한 번, 5,000 바이트에서 한 번, 다시 10,000 번, 다시 20,000 번에서 성장 고통이 나타납니다. 문자열을 추가하면 루프 반복마다 고통이 발생합니다.
내 컴퓨터 에서 문자열의 최대 길이 는 1,073,741,791 입니다.
알다시피, 문자열은 일반적으로 생각되는 정수에 의해 제한되지 않습니다.
메모리 제한 외에, 문자열은 2 30 ( 1,073,741,824)를 초과 할 수 없습니다 Microsoft CLR (Common Language Runtime)에 의해 2GB 제한이 적용되므로 )자를 . 내 컴퓨터가 허용하는 것보다 33 개 더 많음
자, 여기 시도해 볼 수있는 것이 있습니다.
Visual Studio에서 새 C # 콘솔 앱을 만든 다음 기본 방법을 복사 / 붙여 넣기하십시오.
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();
}
내 결과는 다음과 같습니다.
문자열 테스트, Nicholas John Joseph Taylor
이론적으로 C #은 int.MaxValue 문자열을 지원해야하지만 그 전에는 메모리가 부족합니다.
이것은 문자열의 최대 지원 길이를 찾기 위해 결과를 좁히는 빠른 테스트입니다.
테스트가 시작됩니다 ... 지금 :
s. 옷 길이 = 1000000000 08/05/2019 12:06
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:06에. 데시 메이션 후 증가 값은 100000000입니다.
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:06에. 데시 메이션 후 증분 값은 10000000입니다 .s 08 : 05/2019 12:06에서 s.Length = 1010000000 12/06/2019/08/05에서 12:06 s.Length = 1020000000 12:06 s.Length = 1030000000 at 08/05/2019 12 : 06 s. 길이 = 1040000000 2019 년 8 월 5 일 12:06 s. 길이 = 1050000000 08/05/2019 12:06 s. 길이 = 1060000000 08/05/2019 12:06 s. 길이 = 1070000000 08/05/2019 12:06
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:06에. 데시 메이션 후 증분 값은 1000000입니다 .08 / 05 / 2019 12:06에서 길이 = 1071000000 12:06에서 2019 년 08/05/12에서 길이 = 1072000000 12:06 s. 길이 = 1073000000에서 08/05/2019 12 : 06
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:06에. 데시 메이션 후 증분 값은 100000입니다 .2019 년 8 월 5 일 12:06에서 길이 = 1073100000 12:06 초에서 길이 = 1073200000에서 08/05/2019 12:06에서 길이 = 1073300000 : 06 s. 길이 = 1073400000 08/05/2019 12:06 s. 길이 = 1073500000 08/05/2019 12:06 s. 길이 = 1073600000 08/05/2019 12:06 s. 길이 = 1073700000 08/05/2019 12:06
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:06에. 데시 메이션 후 증가 값은 2019 년 8 월 5 일 12시 06 분에 10000 s. 길이 = 1073710000입니다. 08/05/2019 12:06 초에 길이 = 1073720000입니다. 08/05/2019 12에 길이 = 1073730000 12 : 06 s. 길이 = 1073740000, 08/05/2019 12:06
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:06에. 데시 메이션 후 증가 값은 1000입니다. s. Length = 1073741000 at 08/05/2019 12:06
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:06에. 데시 메이션 후 증가 값은 100/2019/08 12:06에서 100 = s. Length = 1073741100 12:06 s. Length = 1073741200에서 08/05/2019 12:06 s. Length = 1073741300 at 08/05/2019 12 : 07 s. 길이 = 1073741400 08/05/2019 12:07 s. 길이 = 1073741500 08/05/2019 12:07 s. 길이 = 1073741600 08/05/2019 12:07 s. 길이 = 1073741700 08/05/2019 12:07
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:07에. 데시 메이션 후 증분 값은 10 / s / 2019 12:07에서 10 = s. 길이 = 1073741710 12:07 s. 길이 = 1073741720에서 08/05/2019 12:07 s. 길이 = 1073741730에서 08/05/2019 12 : 07 s. 길이 = 1073741740에서 08/05/2019 12:07 s. 길이 = 1073741750에서 08/05/2019 12:07 s. 길이 = 1073741760에서 08/05/2019 12:07 s. 길이 = 1073741770에서 08/05/2019 12:07 s. 길이 = 1073741780에서 08/05/2019 12:07 s. 길이 = 1073741790에서 08/05/2019 12:07
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:07에. 데시 메이션 후 증가 값은 1입니다. s. Length = 1073741791 at 08/05/2019 12:07
'System.OutOfMemoryException'유형의 예외가 발생했습니다. 08/05/2019 12:07에. 데시 메이션 후 증가 값은 0입니다. 테스트가 완료되었습니다.
문자열의 최대 길이는 1073741791입니다.
계속하려면 아무 키나 누르십시오.
내 컴퓨터에서 문자열의 최대 길이는 1073741791입니다.
사람들이 아래에 의견으로 결과를 게시 할 수 있다면 대단히 감사하겠습니다.
사람들이 같거나 다른 결과를 얻는 지 배우는 것은 흥미로울 것입니다.
200 megs ...이 시점에서 앱이 가상 정지 상태가되고 약한 작업 세트 메모리가 있으며 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