PDA

View Full Version : چطور می تونم تمام فایلی رو تو حافظه داشته باشم؟



mbshareat
شنبه 18 دی 1389, 20:17 عصر
با سلام و خدا قوت:قلب:
من یه فایل بزرگ دارم و میخوام تو محتویات اون جستجو کنم.
روش خودم این بود که تکه تکه فایل رو می خوندم و بررسی می کردم. می خوام بدونم راهی هست که کل فایل رو یکجا تو حافظه داشته باشم که مثلا اگه برنامم از شبکه یا از CD اجرا شد مشکل سرعت نداشته باشم؟:قهقهه:
در ضمن می خواستم بدونم آیا کار با رشته خیلی طولانی که از TStringList بدست اومده سریعتره(و آیا قابل اطمینانه!؟) یا کار با چنین فایلی که تو حافظه است؟:متفکر:

Felony
شنبه 18 دی 1389, 21:13 عصر
در ضمن می خواستم بدونم آیا کار با رشته خیلی طولانی که از TStringList بدست اومده سریعتره(و آیا قابل اطمینانه!؟) یا کار با چنین فایلی که تو حافظه است؟
وقتی فایل تو StringList بارگذاری میشه یعنی تو حافظه قرار گرفته !

میتونید از TStringStream استفاده کنید .

mbshareat
یک شنبه 19 دی 1389, 13:31 عصر
با سلام خدمت بزرگان
جناب آقای تاجیک آیا با این روش اگر یه فایل چند مگابایتی داشته باشم و بخوام با چیزی شبیه ;MyString:=MYStringList.Text رشته ای بدست بیارم و با توابع رشته مثل Delete و Insert و Copy روش کار کنم، در این صورت به خاطر حجم بالای رشته که از یک Segment (که 64 کیلو بایته) بیشتره دچار مشکل نخواهم شد؟
یه سوال دگه هم داشتم آیا FileStream فایل رو تو حافظه بارگذاری نمی کنه؟(اگه این کار رو نمی کنه معنی Stream چیه؟)

vcldeveloper
یک شنبه 19 دی 1389, 16:22 عصر
در این صورت به خاطر حجم بالای رشته که از یک Segment (که 64 کیلو بایته) بیشتره دچار مشکل نخواهم شد؟
حجم بالای یک Segment؟! مگه دارید برنامه داس 16-بیتی می نویسید؟ تا جایی که سیستم تون به برنامه تون حافظه اختصاص بده، می تونید توی TStringList داده ذخیره کنید.


یه سوال دگه هم داشتم آیا FileStream فایل رو تو حافظه بارگذاری نمی کنه؟
نه، از توابع خواندن و نوشتن فایل در ویندوز استفاده میکنه. فایل رو روی دیسک باز میکنه، میره به محل مورد نظر شما در فایل، و به مقداری که ازش درخواست کنید، محتوای فایل را براتون در بافر ایی که براش تعیین کردید، کپی میکنه.


اگه این کار رو نمی کنه معنی Stream چیه؟
دنباله ایی که از داده ها، این داده ها ممکنه از منابع مختلفی (مثل فایل یا RAM یا سوکت، و غیره) به دست بیان.

mbshareat
دوشنبه 20 دی 1389, 14:23 عصر
با سلام و درود
من می خوام یه فایل متنی Plain Text رو بخونم که خیلی بزرگه.
می بخشید آقای کشاورز شما توی این پست (http://barnamenevis.org/search.php?searchid=51664) برای کار با TStringStream این دستور را تو نمونه کد گذاشتین:

StrStream := TStringStream.Create('',TEncoding.Unicode);
اما تو نسخه دلفی من (6) این دستور تنها یه پارامتر داره: AString
منظور از این پارامتر چیه؟
یه سوال دیگه هم دارم آیا memorystream فایل رو به حافظه می بره؟

vcldeveloper
دوشنبه 20 دی 1389, 15:10 عصر
اما تو نسخه دلفی من (6) این دستور تنها یه پارامتر داره: AString
منظور از این پارامتر چیه؟
شما نیاز به اون پارامتر دوم ندارید. اون کدی که من در تاپیک دیگه قرار دادم، مربوط به دلفی 2010 هست. در اون نسخه میشه در زمان لود کردن متن، Encoding متن رو هم مشخص کرد. در دلفی 6، اون کلاس فقط با ANSI کار میکنه، و از یونیکد پشتیبانی نمیکنه.


یه سوال دیگه هم دارم آیا memorystream فایل رو به حافظه می بره؟
MemoryStream, StringStream, StringList و غیره همگی فایل رو در حافظه لود می کنند.

mbshareat
دوشنبه 20 دی 1389, 19:30 عصر
با سلام و عرض ادب
جناب آقای کشاورز من می دونم که یه پارامتر داره اما همون یه پارامتر ( AString) رو چطور مقدار بدم؟
راستش مثالی توی Help برای کار با stringstream پیدا نکردم.

vcldeveloper
سه شنبه 21 دی 1389, 00:30 صبح
جناب آقای کشاورز من می دونم که یه پارامتر داره اما همون یه پارامتر ( AString) رو چطور مقدار بدم؟
راستش مثالی توی Help برای کار با stringstream پیدا نکردم.
شما اگر میخواید داده رو از فایل لود کنید، اصلا نیازی به اون پارامتر ندارید. تا جایی که یادم هست، یک overload از create بدون پارامتر هم باید داشته باشه. اگر نداره، یه string خالی بهش بدید. بعد از Create شدن، می تونید از طریق متد LoadFromFile اش، یک فایل را در اون لود کنید.