PDA

View Full Version : نوع داده ای بزرگتر از string



مهدی رحیم زاده
سه شنبه 01 آذر 1390, 20:57 عصر
با سلام
خدمت دوستان عزیز
چه نوع داده ای توی دات نت هست که بشه توش یک رشته طولانی رو ذخیره کرد؟
با تشکر

سوداگر
چهارشنبه 02 آذر 1390, 02:01 صبح
میتونی یک شیء RichTextBox ایجاد کنی و اون رشته طولانی! رو داخل خصوصیت Text اون ذخیره کنی. من امتحان کردم تا نزدیک 10 میلیارد کاراکتر ایرادی نداشت.
RichTextBox rt = new RichTextBox();
rt.Text=myLongString;

2ndesigner
چهارشنبه 02 آذر 1390, 02:20 صبح
عجب!

خاصیت تکست rich textbox هم از نوع استرینگه.

mmd2009
چهارشنبه 02 آذر 1390, 02:29 صبح
با سلام

وقتی میگیم رشته طولانی پس مطمن هستیم که String کلا به درد ما نمیخوره چون هم ضعیفه و هم اینکه سرعتش خیلی پایینه و خیلی نکته دیگه ولی StringBuilder کاربردش خیلی بیشتره و سرعتش هم خیلی بیشتره همراه با صد البته حجم گرفتن اطلاعاتش.

شما فرضا 30 میلیون کاراکتر رو با StringBuilderدر یک چشم به هم زدن میگیری ولی با String ؟!


البته یاداور بشم که StringBuilder همیشه هم سریعتر از String عمل نمیکنه. فرضا در کد زیر :


string timeStringBuilder =
"Start ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";

for (int i = 0; i <= 1000000; i++)
{
var s = new StringBuilder();
s.Append(i.ToString());
s.Append(i.ToString());
s.Append(i.ToString());
}
timeStringBuilder +=
"Stop ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";


string timestring =
"Start ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")"; ;

for (int i = 0; i <= 1000000; i++)
{
string s = i.ToString();
s = s + i;
s = s + i;
}
timestring +=
"Stop ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";

txtSt.Text = timestring;
txtStBu.Text = timeStringBuilder;



موفق باشید.

محمد فدوی
چهارشنبه 02 آذر 1390, 02:37 صبح
درسته ولی من فقط یک نکته رو گوشزد کنم...
بازم بستگی داره به هدف...
اگه قرار باشه یه رشته با طول نجومی رو ذخیره کنی دیگه نه string و نه StringBuilder کاربرد داره. اگر قراره که فقط یک رشته رو ذخیره کنی به نظرم می تونی بری سراغ IO.
ولی اگه میخوای توی این رشته ی نجومی تغییراتی هم ایجاد کنی فکر کنم بهترین راه استفاده از Local Database باشه. مثلا هر خط رو در یک رکورد ذخیره کنی...
سرعت میاد پایین ولی ثبات داده ها تضمین میشه
به هر حال هر چیزی بهایی داری... :چشمک:

سوداگر
چهارشنبه 02 آذر 1390, 10:45 صبح
عجب!
خاصیت تکست rich textbox هم از نوع استرینگه.
من فکر میکردم خصوصیت Text کنترل RichTextBox با string متفاوته یعنی درسته مقدار Get شده اون استرینگه ولی در درون کلاس RichTextBox اون رو طوری دیگه مدیریت میکنه!:گیج:
یک سوال؟
من دیده ام که تمام متن اخبار و متون و .... ای را که در سایتی میگذارند، آنرا (در دیتابیس) داخل ستونی از نوع Text ذخیره می کنند. میخواستم بدونم کسی اطلاعی در مورد آستانه تحمل این اشیاءی که متن را ذخیره می کند، چیزی می داند؟

محمد فدوی
چهارشنبه 02 آذر 1390, 14:58 عصر
اگه یک متغیر از string بسازید تا وقتی سیستم کم نیاره می تونی گسترشش بدی...
ولی وقتی از یک دیتابیس استفاده می کنی دیگه داده ها رو به هارد منتقل می کنی که باعث کاهش سرعت و افزایش بی اندازه ی ظرفیت میشه...

Rejnev
چهارشنبه 02 آذر 1390, 15:39 عصر
البته یاداور بشم که StringBuilder همیشه هم سریعتر از String عمل نمیکنه. فرضا در کد زیر...


سلام
کدی که شما نوشتین رو تست نکردم، ولی نادید میشه گفت که یک میلیون بار یک شی رو ساختن (string builder) طبیعتا کندتر از تعریف متغیر خواهد بود...
این کد من رو امتحان کنید:

string timeStringBuilder =
"Start ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";
var s = new StringBuilder();
for (int i = 0; i <= 10000; i++)
{
s.Append(i.ToString());
s.Append(i.ToString());
s.Append(i.ToString());
}
timeStringBuilder +=
"Stop ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";


string timestring =
"Start ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")"; ;
string s2=string.Empty;
for (int i = 0; i <= 10000; i++)
{
s2 = s2 + i.ToString();
s2 = s2 + i.ToString();
s2 = s2 + i.ToString();
}
timestring +=
"Stop ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";

MessageBox.Show(timeStringBuilder+Environment.NewL ine+timestring);

محمد فدوی
چهارشنبه 02 آذر 1390, 17:37 عصر
نظر شخصی من اینه که StringBuilder همواره سریع تر از String عمل می کنه...

mmd2009
چهارشنبه 02 آذر 1390, 19:51 عصر
سلام
کدی که شما نوشتین رو تست نکردم، ولی نادید میشه گفت که یک میلیون بار یک شی رو ساختن (string builder) طبیعتا کندتر از تعریف متغیر خواهد بود...
این کد من رو امتحان کنید:

string timeStringBuilder =
"Start ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";
var s = new StringBuilder();
for (int i = 0; i <= 10000; i++)
{
s.Append(i.ToString());
s.Append(i.ToString());
s.Append(i.ToString());
}
timeStringBuilder +=
"Stop ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";


string timestring =
"Start ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")"; ;
string s2=string.Empty;
for (int i = 0; i <= 10000; i++)
{
s2 = s2 + i.ToString();
s2 = s2 + i.ToString();
s2 = s2 + i.ToString();
}
timestring +=
"Stop ( " + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + ")";

MessageBox.Show(timeStringBuilder+Environment.NewL ine+timestring);


روش مقایسه ای که من انجام دادم کامللا درست بود. و نتیجش هم مشخص. هدف من مشخص کردن ضعف StringBuilder در چنین شرایطی بود

موفق باشید

omidh2007
چهارشنبه 02 آذر 1390, 21:47 عصر
نمیشه همیشه و به طور قطعی گفت string بهتر عمل میکنه یا StringBuilder .
بر اساس این که تعداد ورودی ها و عملیات چقدره و همینطور نوع عملیات (append , remove , Replace , ... ) فرق میکنه .
این فروم به با آزمایش و نمودار مقایسه کرده .
http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx

mmd2009
چهارشنبه 02 آذر 1390, 22:19 عصر
نمیشه همیشه و به طور قطعی گفت string بهتر عمل میکنه یا StringBuilder .
بر اساس این که تعداد ورودی ها و عملیات چقدره و همینطور نوع عملیات (append , remove , Replace , ... ) فرق میکنه .
این فروم به با آزمایش و نمودار مقایسه کرده .
http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx

بله 100 درصد. من تمامی پستهام دلیلشون این نبوده که StringBuilder از string بهتره. بلکه بحث ما در مورد سرعت و پردازش رشته های ورودیه و اندازه گرفتن رشته هست. که در چنین شرایطی string قابل رقابت نیست با StringBuilder

navidnkh
چهارشنبه 11 اردیبهشت 1392, 00:41 صبح
سلام همونطور که دوستمون Dezfoul گفتن بهترین راه استفاده از ریچ تکست باکس هست ، البته فابل ها هم بد نیست ولی اعصاب خورد کنه
ولی اگر خواستی این حجم داده ای رو داخل یک فیلد تو بانک ذخیره کنی
در اکسس : نوع فیلد Memo
در Sqlserver : نوع فیلد text
که اینا حدودا میتونن چندین صفحه کاراکتر رو ذخیره کنن داخل خودشون
نوع text دقیقا میتونه اینقدر کاراکتر رو در خودش ذخیره کنه 2,147,483,647 البته اگر کاراکتر هات Ascii باشند اگر Unicode باشند هر کاراکتر معادل 2 byte پس باید این مقدار رو نصف کنی میشه حدودن 1,073,741,823

tooraj_azizi_1035
چهارشنبه 11 اردیبهشت 1392, 15:32 عصر
رویکرد StringBuilder رو در پیش بگیرید به دلیل Performance:


Performance Considerations

A String (http://msdn.microsoft.com/en-us/library/system.string.aspx) object concatenation operation always creates a new object from the existing string and the new data. A StringBuilder object maintains a buffer to accommodate the concatenation of new data. New data is appended to the buffer if room is available; otherwise, a new, larger buffer is allocated, data from the original buffer is copied to the new buffer, and the new data is then appended to the new buffer.



منبع:http://msdn.microsoft.com/en-us/library/y9sxk6fy.aspx

FastCode
چهارشنبه 11 اردیبهشت 1392, 16:34 عصر
rope/stringbuilder مزایا و مشکلات خودش رو داره.مثلا میشه به شکل parallel ازش استفاده کرد.(فکر نمیکنم دات نت از این خاصیت پشتیبانی کنه.)
یا سرعت خیلی بالا در find/replace/trim/append/remove
در مقابل string حجم نسبتا کمتری حافظه مصرف میکنه که باعث میشه در تعداد های بالای میلیون و طول های کوتاه از stringbuilder خیلی به صرفه تر باشه.
http://en.wikipedia.org/wiki/Rope_%28data_structure%29
در صورتی که rope درست implement بشه میشه خیلی از الگوریتم هاش رو embarrassingly parallel در نظر گرفت که با سر و صدایی که CUDA و OpenCL در این مدت اخیر به پا کردن فکر میکنم قابل توجه OP باشه