.NET স্ট্রিংয়ের সর্বোচ্চ সম্ভাব্য দৈর্ঘ্য কত?


239

.NET- এ তৈরি করা দীর্ঘতম স্ট্রিংটি কী? জন্য দস্তাবেজString বর্গ যতটা আমি দেখতে পারেন, এই প্রশ্নে নীরব তাই একটি প্রামাণিক উত্তর অভ্যন্তরীণ কিছু জ্ঞান দরকার হবে। একটি 64-বিট সিস্টেমে সর্বাধিক পরিবর্তন হবে?

[এটি ব্যবহারিক ব্যবহারের চেয়ে কৌতূহলের জন্য আরও জিজ্ঞাসা করা হয়েছে - আমি এমন কোনও কোড তৈরি করার ইচ্ছা করি না যা বিশালাকার স্ট্রিং ব্যবহার করে!]

উত্তর:


346

তাত্ত্বিক সীমাটি 2,147,483,647 হতে পারে, তবে ব্যবহারিক সীমা এর কাছাকাছি কোথাও নেই। যেহেতু .NET প্রোগ্রামের কোনও একক বস্তু 2GB এর বেশি না হতে পারে এবং স্ট্রিংয়ের ধরণটি UTF-16 (প্রতিটি চরিত্রের জন্য 2 বাইট) ব্যবহার করে, তাই আপনি সবচেয়ে ভাল করতে পারেন 1,073,741,823, তবে আপনি কখনও বরাদ্দ দিতে সক্ষম হবেন না একটি 32 বিট মেশিনে।

এটি এমন একটি পরিস্থিতিতে যেখানে "যদি আপনাকে জিজ্ঞাসা করতে হয় তবে আপনি সম্ভবত কিছু ভুল করছেন।"


8
এটা সঠিক উত্তর. স্ট্রিংয়ের দৈর্ঘ্য ছাড়িয়ে যাওয়ার জন্য পর্যাপ্ত পরিমাণ বরাদ্দ দিতে সক্ষম হওয়ার আগে আপনার মেমরি ফুরিয়ে যাওয়ার সম্ভাবনা বেশি। একটি নতুন বুটে আপনি এখানে উল্লিখিত হিসাবে 2 জিবি (1 এম অক্ষর সহ) এর বরাদ্দ টানতে সক্ষম হতে পারেন, তবে এটিই যথেষ্ট।
স্টিফেন ডেকেন

4
আপনার "কোনও একক বস্তু 2Gb এর বেশি হতে পারে না" এই ধারণাটি সঠিক বলে ধরে নেওয়া, এটি তাত্ত্বিক সীমাও তেমনি ব্যবহারিক এক - স্ট্রিংয়ের দৈর্ঘ্যের সীমাবদ্ধতা হবে সামগ্রিক আকারের আকার, দৈর্ঘ্যের ক্ষেত্রের ক্ষমতা নয়।
ম্যাককেঞ্জিজি 1

12
যদি কেউ সঠিক মানটিতে আগ্রহী হন তবে আমার 64৪-বিট মেশিনে এটি 1,073,741,791 (1024 · 1024 · 1024 - 33) অক্ষর। এর সঠিক সর্বোচ্চ আকার সম্পর্কে আমার সম্পর্কিত প্রশ্নটিওbyte[] দেখুন ।
সোভিক

4
আমি উত্তরগুলি সম্পর্কে ক্ষিপ্ত হয়ে উঠি যার সংক্ষিপ্ত কিন্তু গভীরতার ব্যাখ্যা রয়েছে।
মিকায়েল আব্দুললাইভ

3
.NET 4.5 (এবং তারপরে) অবজেক্টগুলিকে 64-বিট মেশিনে 2GB এর চেয়ে বড় হতে দেয় to এখানে চেক করুন
অ্যান্ডারসন ম্যাটোস

72

আমার অত্যন্ত বৈজ্ঞানিক এবং নির্ভুল পরীক্ষার উপর ভিত্তি করে, এটি আমার মেশিনে 1,000,000,000 অক্ষরের আগে ভাল। (আরও ভাল পয়েন্টপয়েন্ট পেতে আমি নীচের কোডটি এখনও চালাচ্ছি)।

আপডেট: কয়েক ঘন্টা পরে, আমি ছেড়েছি । চূড়ান্ত ফলাফল: তাত্ক্ষণিকভাবে ১,০০,০০,০০০ অক্ষর দেওয়া System.OutOfMemoryExceptionহলেও ১০০,০০,০০০ অক্ষরের চেয়ে অনেক বড় যেতে পারে ।

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
}

35
এখানে বাইনারি অনুসন্ধান প্রয়োগ করা আপনাকে সম্ভবত এই উত্তরটি আরও দ্রুত খুঁজে পেতে সহায়তা করবে ...
মারিও

49

যেহেতু এর Lengthসম্পত্তি System.Stringহ'ল একটি Int32, তাই আমি অনুমান করব যে সর্বাধিক দৈর্ঘ্য 2,147,483,647 অক্ষর (সর্বাধিক Int32আকার) হবে। এটি যদি আর অনুমতি দেয় তবে আপনি দৈর্ঘ্যটি পরীক্ষা করতে পারবেন না কারণ এটি ব্যর্থ হবে।


2
@ এম.এডমন্ডসন: আমি আসলে বিশ্বাস করি না। উদাহরণগুলির জন্য একটি অ্যারেরLongLength পাশাপাশি রয়েছে এবং প্রবাহটি longদৈর্ঘ্য হিসাবে ব্যবহার করে । যদিও এটি বৈধ উত্তর, এটি পরিমাপ করার সঠিক উপায় নুড।
উইলেম ভ্যান অনসেম

1
তবে প্রথম দুটি বিট ASCII / অ-ASCII ইঙ্গিত হিসাবে যেমনটি এই নিবন্ধটি বলেছে ব্যবহার করা হয়, সুতরাং এটি 2 ^ 30 = 1 073 741 824 হওয়া উচিত
সাইটো

28

এই বিষয়ে যে কোনও দেরীতে আসার জন্য, আমি দেখতে পেলাম যে হিটস্কানের "আপনার সম্ভবত এমনটি করা উচিত নয়" কারও কাছে তাদের জিজ্ঞাসা করতে হবে যে তাদের কী করা উচিত ...

StringBuilder বর্গ প্রায়ই একটি সহজ প্রতিস্থাপন। এক বিবেচনা করুন প্রবাহ ভিত্তিক শ্রেণীর বিশেষত, যদি আপনার ডেটা একটি ফাইল থেকে আসছে।

সমস্যাটি s += "stuff"হ'ল এটিকে ডেটা ধরে রাখতে সম্পূর্ণ নতুন ক্ষেত্র বরাদ্দ করতে হবে এবং তারপরে পুরানো সমস্ত ডেটা প্লাস করে নতুন স্টাফ - প্রতিটি এবং প্রতিটি লুপ আইট্রেইনস করতে হবে। সুতরাং, পাঁচটি বাইট সহ 1,000,000 এর সাথে যুক্ত s += "stuff"করা অত্যন্ত ব্যয়বহুল। আপনি যা চান তা যদি শেষের দিকে কেবল পাঁচটি বাইট লিখতে হয় এবং আপনার প্রোগ্রামটি নিয়ে এগিয়ে যেতে হয় তবে আপনাকে এমন একটি ক্লাস বাছাই করতে হবে যা বিকাশের জন্য কিছু জায়গা ছেড়ে দেবে:

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

StringBuilderহবে দ্বিগুন দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হত্তয়া যখন এটি এর সীমা স্পর্শ নেই। সুতরাং, আপনি একবার বৃদ্ধির ব্যথা শুরুতে একবারে 5000 বার বয়েস, আবার 10,000 এ, আবার 20,000 এ দেখতে পাবেন। স্ট্রিং যুক্ত করা প্রতিটি লুপের পুনরাবৃত্তির ব্যথা ঘটাবে।


4
এটি লক্ষণীয় যে স্ট্রিংবিল্ডার আপনাকে প্রাথমিক আকার সেট করতে দেয়। আপনি যদি জানেন যে আপনি সময়ের আগে 10,000,000 এন্ট্রি ব্যবহার করতে যাচ্ছেন, তবে দরকারী যদি আপনাকে কিছু ক্রাচ উপেক্ষা করতে দেয়।
কাইল বারান

3
+1 প্রশ্নের মাধ্যমে দেখতে এবং ভাল ডিজাইনের উত্তর দেওয়ার জন্য। তুলনামূলকভাবে, "আপনার স্ট্রিংটি
ফুঁকানোর

8

একটি স্ট্রিংয়ের সর্বোচ্চ দৈর্ঘ্য আমার মেশিনে হয় 1.073.741.791

আপনি দেখতে পাচ্ছেন, স্ট্রিংসটি সাধারণত বিশ্বাস হিসাবে পূর্ণসংখ্যার দ্বারা সীমাবদ্ধ নয়।

স্মৃতি বিধিনিষেধ সরাইয়া স্ট্রিং 2 চেয়ে বেশি থাকতে পারে না 30 ( 1,073,741,824 ) অক্ষর, থেকে একটি 2GB সীমা মাইক্রোসফট CLR (সাধারণ ভাষা রানটাইম) দ্বারা আরোপিত হয়। আমার কম্পিউটার অনুমোদিত থেকে 33 টি বেশি।

এখন, এখানে কিছু এমন যা আপনি নিজের চেষ্টা করার জন্য স্বাগত।

ভিজ্যুয়াল স্টুডিওতে একটি নতুন সি # কনসোল অ্যাপ্লিকেশন তৈরি করুন এবং তারপরে মূল পদ্ধতিটি এখানে কপি / পেস্ট করুন:

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

}

আমার ফলাফলগুলি নীচে ছিল:

স্ট্রিং টেস্ট, নিকোলাস জন জোসেফ টেইলর

তাত্ত্বিকভাবে, সি # এর অন্তর্নির্মিত স্ট্রাক্সকে সমর্থন করা উচিত ax ম্যাক্সভ্যালু, তবে আমরা তার আগে মেমরি শেষ করে নিই।

স্ট্রিংয়ের সর্বাধিক সমর্থিত দৈর্ঘ্যের সন্ধানের জন্য ফলাফলগুলি সঙ্কুচিত করার জন্য এটি তাত্পর্যপূর্ণ পরীক্ষা।

পরীক্ষা শুরু হয় ... এখন:

s.Length = 1000000000 08/05/2019 12:06 এ

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:06 এ। ডেসিমেশনের পরে বর্ধনের মান 100000000।

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:06 এ। সিদ্ধান্ত গ্রহণের পরে, বর্ধনের মান 10000000. এস.এল দৈর্ঘ্য = 1010000000 08/05/2019 12:06 এস.লাইনথ = 1020000000 এ 08/05/2019 12:06 এস.লাইনথ = 1030000000 08/05/2019 12 এ : 06 s.Length = 1040000000 at 08/05/2019 12:06 s.Length = 1050000000 at 08/05/2019 12:06 s.Length = 1060000000 at 08/05/2019 12:06 s.Length = 1070000000 08/05/2019 12:06

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:06 এ। সিদ্ধান্ত গ্রহণের পরে বর্ধনের মান 1000000. এস লেন্থ = 1071000000 08/05/2019 12:06 এস.এল দৈর্ঘ্য = 1072000000 এ 08/05/2019 12:06 এস.লাইনথ = 1073000000 08/05/2019 12 এ : 06

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:06 এ। সিদ্ধান্ত গ্রহণের পরে, বর্ধনের মান 100000. এস.এল দৈর্ঘ্য = 1073100000 08/05/2019 12:06 এস.ই. দৈর্ঘ্য = 1073200000 এ 08/05/2019 12:06 এস.লাইনথ = 1073300000 08/05/2019 12 এ : 06 s.Length = 1073400000 at 08/05/2019 12:06 s.Length = 1073500000 08/05/2019 12:06 s.Length = 1073600000 08/05/2019 12:06 s.Length = 1073700000 এ 08/05/2019 12:06

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:06 এ। সিদ্ধান্ত গ্রহণের পরে, বর্ধনের মান 10000. এস লেন্থ = 1073710000 08/05/2019 12:06 এস.ই. দৈর্ঘ্য = 1073720000 এ 08/05/2019 12:06 এস.লাইনথ = 1073730000 08/05/2019 12 এ : 06 এস। দৈর্ঘ্য = 1073740000 08/05/2019 12:06 এ

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:06 এ। সিদ্ধান্ত গ্রহণের পরে, বর্ধনের মান 1000. s.Length = 1073741000 08/05/2019 12:06 এ

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:06 এ। সিদ্ধান্ত গ্রহণের পরে বর্ধনের মান 100. s.Length = 1073741100 08/05/2019 12:06 s.Length = 1073741200 at 08/05/2019 12:06 s.Length = 1073741300 08/05/2019 12 এ : 07 s.Length = 1073741400 at 08/05/2019 12:07 s.Length = 1073741500 at 08/05/2019 12:07 s.Length = 1073741600 08/05/2019 12:07 s.Length = 1073741700 at 08/05/2019 12:07

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:07 এ। সিদ্ধান্ত গ্রহণের পরে বর্ধনের মান 10. ​​s.Length = 1073741710 at 08/05/2019 12:07 s.Length = 1073741720 08/05/2019 12:07 s.Length = 1073741730 08/05/2019 12 এ : 07 s.Length = 1073741740 at 08/05/2019 12:07 s.Length = 1073741750 at 08/05/2019 12:07 s.Length = 1073741760 08/05/2019 12:07 s.Length = 1073741770 এ 08/05/2019 12:07 s.Length = 1073741780 at 08/05/2019 12:07 s.Length = 1073741790 at 08/05/2019 12:07

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:07 এ। সিদ্ধান্ত গ্রহণের পরে, বর্ধনের মান 1 হয় s. দৈর্ঘ্য = 1073741791 08/05/2019 12:07 এ

'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। 08/05/2019 12:07 এ। ডেসিমেশনের পরে বর্ধনের মান 0 পরীক্ষা শেষ হয়।

একটি স্ট্রিংয়ের সর্বাধিক দৈর্ঘ্য 1073741791।

চালু রাখবার জন্য যেকোনো বোতাম চাপুন.

আমার মেশিনে স্ট্রিংয়ের সর্বাধিক দৈর্ঘ্য 1073741791।

নীচে মন্তব্য হিসাবে লোকেরা যদি তাদের ফলাফল পোস্ট করতে পারে তবে আমি এটির খুব প্রশংসা করব।

লোকেরা একই বা ভিন্ন ফলাফল পায় কিনা তা শিখতে আকর্ষণীয় হবে।


"আপনি দেখুন, স্ট্রিংস সাধারণত বিশ্বাস হিসাবে পূর্ণসংখ্যার দ্বারা সীমাবদ্ধ নয়।" -> সি # তে একটি পূর্ণসংখ্যা 2,147,483,647 পর্যন্ত যেতে পারে এবং আপনার ফলাফলটি খুব কাছাকাছি (32 বাইট কম) এই মানটিকে দুটি দ্বারা বিভক্ত করে, যা স্ট্রিংয়ের প্রতিটি চরিত্র দুটি বাইটে ইউনিকোড হিসাবে স্টোর হিসাবে যুক্তিসঙ্গত। সুতরাং এমনকি যদি পূর্ণসংখ্যার আকার দ্বারা সীমাটি আরোপিত না হয় তবে এটি উল্লেখযোগ্যভাবে এটির কাছাকাছি।
বেন

2

200 মেগা ... এই মুহুর্তে আপনার অ্যাপ্লিকেশনটি ভার্চুয়াল স্টপের সাথে গ্রাইন্ড হয়, প্রায় একটি গিগ ওয়ার্কিং সেট মেমরি থাকে এবং ও / গুলি আপনাকে পুনরায় বুট করার মতো কাজ শুরু করে।

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

5
আমি নিশ্চিত না যে কেবলমাত্র একটি বড় স্ট্রিং তৈরি করে আপনি যে আচরণটি পাবেন তা হ'ল আপনি যা দেখছেন ঠিক তার মতোই তাদের একগুচ্ছ বরাদ্দ করে এবং তর্ক দিয়েছিলেন।
কেসি

2

যেহেতু String.Lengthএকটি পূর্ণসংখ্যা ( Int32এটির জন্য একটি উপাধি ) তাই এর আকারটি Int32.MaxValueইউনিকোড অক্ষরগুলিতে সীমাবদ্ধ । ;-)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.