PDA

View Full Version : کار با فایل



farnaz2003
یک شنبه 15 بهمن 1385, 15:09 عصر
من حجم زیادی داده در چندین فایل دارم که مایلم آنها را بر اساس معیارهای جدید در فایل های دیگری ذخیره کنم.


برای این کار من تک تک مقادیر را از فایل های اولیه می خونم و بعد فایل جدید مربوط به آن را باز کرده داده ام را در آن می نویسم writer ام را close می کنم بعد داده بعد را از فایل اولیه می خونم و به همین ترتیب.





FileStream ff = new FileStream(filename, FileMode.Append, FileAccess.Write)


BinaryWriter w = new BinaryWriter(ff)


w.Write(data)


w.Close()
یعنی این قطعه کد به ازای هر یک بار خواندن از فایل اصلی داره تکرار میشه .لطفا من را راهنمایی کنید. در ضمن filename ام هر بار تغییر میکنه.(تعداد فایل هام خیلی زیاده).

RED-C0DE
یک شنبه 15 بهمن 1385, 18:27 عصر
نمی دونم این نوشته farnaz2003 فقط توی مرورگر من خونده نمی شه یا بقیه دوستان هم این مشکل رو داردن؟؟!!

Alireza_Salehi
یک شنبه 15 بهمن 1385, 18:29 عصر
]چرا اینقدر تگ FONT داره ،اصلا قابل خوندن نیست!

PC2st
یک شنبه 15 بهمن 1385, 19:35 عصر
من هم همش FONT میبینم و فکر کنم برای همه اینجوریه! شاید استفاده از کدهائی که داخل ] و [ هستند توی تنظیمات کاربری (farnaz2003) غیر فعال باشه! نوشته باید چیزی مثل زیر باشه:



من حجم زیادی داده در چندین فایل دارم که مایلم آنها را بر اساس معیارهای جدید در فایل های دیگری ذخیره کنم.
برای این کار من تک تک مقادیر را از فایل های اولیه می خونم و بعد فایل جدید مربوط به آن را باز کرده داده ام را در آن می نویسم writer ام را close می کنم بعد داده بعد را از فایل اولیه می خونم و به همین ترتیب.

FileStream ff = new FileStream(filename, FileMode.Append, FileAccess.Write)
BinaryWriter w = new BinaryWriter(ff)
w.Write(data)
w.Close()
یعنی این قطعه کد به ازای هر یک بار خواندن از فایل اصلی داره تکرار میشه .لطفا من را راهنمایی کنید. در ضمن filename ام هر بار تغییر میکنه.(تعداد فایل هام خیلی زیاده).


جواب: خوب میتونی یک آرایه از filename هات درست کنی و اون رو توی کدهای بالا قرار و به کمک حلقه for به ازای هر تکرار یک filename جدید داشته باشی، مثلا:


string[] filename=new string[3];
for(int i=0;i<=2;i++)
{
FileStream ff = new FileStream(filename[i], FileMode.Append, FileAccess.Write)
BinaryWriter w = new BinaryWriter(ff)
w.Write(data)
w.Close()
}

farnaz2003
دوشنبه 16 بهمن 1385, 07:45 صبح
منظورم اینه که این تکه کد در اجرای برنامه داره تکرار میشه یعنی برای هربار نوشتن در فایل دارم یک writer تعریف می کنم و بعد دوباره اون را close می کنم.و این سرعت کارم رو بشدت پایین آورده.یعنی چون دارم از یک writer برای چندین فایل استفاده می کنم مجبورم مرتب new و close اش کنم.

farnaz2003
سه شنبه 17 بهمن 1385, 11:10 صبح
یعنی کسی نمیدونه؟

farnaz2003
چهارشنبه 18 بهمن 1385, 09:18 صبح
ببینید کاری که من می خوام بکنم دقیقا اینه که
من 100000 تا کتاب دارم برای هر کدام یک فایل در نظر گرفتم و کلماتی که تو هر کتاب هست رو در فایلش لیست کردم (البته id هایش را) حالا می خوام عکس اش را انجام بدم
و از روی فایل کتابها فایل کلمات را بسازم و برای هر کلمه لیست کتابهایی که اون کلمه توش بوده رو در بیارم.
برای این کار من از کتاب اول شروع کردم و یکی یکی از روی لیست کلماتش رفتم و در فایل کلمه اش نوشتم که این کلمه تو این کتاب هست و بعد رفتم سراغ کتاب دوم و....
حالا حساب کنید که 100000 تا کتاب و هر کدوم 20000 تا کلمه یعنی من 200000000 تا مراجعه به فایل برای نوشتن دارم که خیلی خیلی طول می کشه و عملی نیست.
شاید بگید این کار را با دیتا بیس انجام بده ولی من مجبورم که حتما با فایل انجام بدم.
تمنا می کنم فوری کمک کنید!!!!

Alireza_Salehi
چهارشنبه 18 بهمن 1385, 13:12 عصر
فکر کنم دیتابیس برای همین درست شده باشه که شما با فایل های منطقا از هم جدا (جدول) در یک فایل فیزیکی واحد بتونید کار کنید (البته اگر تمام مزایای دیتابیس رو بذاریم کنار و از این بعد به مسئله نگاه کنیم)

علی القاعده به ازای هر فایل جدید شما باید اشیاء کار با فایل رو مجددا مقدار دهی و تنظیم کنید که مسلما برای 200000000 مراجعه خیلی پرهزینه میشه!

ساده ترین فایده یک دیتابیس اینه که شما بدون توجه به ساختار فیزیکی محل ذخیره سازی با واحد های منطقی جدا از هم کار می کنید و بسیاری از عملیات دستی سیستم فایل در اینجا به صورت اتوماتیک انجام میشه !

شاید این روشی که شما انتخاب کرده اید قابل بهینه سازی باشه ولی فکر کنم با شرایط موجود نباید انتظار تحولی عظیم در کارایی این روش رو داشته باشید!

در ضمن اگر براتون امکان داره دلیل انتخاب این روش یا اصلا کاربردش رو توضیح بدید ، فکر کنم در روشن تر شدن مسئله کمک بکنه (چون این روش در هنگام خواندن هم با مشکل مواجه خواهد شد ، اصولا دستیابی به این همه فایل خیلی زمان بره).

farnaz2003
پنج شنبه 19 بهمن 1385, 11:41 صبح
گفتم که مجبورم چون اینطوری ازم خواسته شده
البته مشکلات زمان بازیابی این همه داده از دیتابیس هم کمتر از این نیست.

شما چی پیشنهاد میکنید؟

Alireza_Salehi
پنج شنبه 19 بهمن 1385, 11:59 صبح
عزیزم دیتابیس رو اینقدر دسته کم نگیر 200000000 تا که رقمی نیست!


یک راهی که به نظر من میرسه اینه که به جای اینکه فایل ها رو دونه دونه بخونی بعد همون لحظه تو فایل بنویسی ، تا جایی که حافظه اجازه میده فایل ها رو بخون و مثلا در ارایه قرار بده (یعنی فایل کلمات رو روی رم بساز) بعد تمام این ها رو با یک حلقه به فایل منتقل کن(یعنی فایل هر کلمه رو فقط یک بار باز می کنی)

برای خوندن فایل کتابها که فکر نمیکنم راهی جز باز کردن تک تک اونها باشه ، ولی برای نوشتن میشه فقط یک بار فایل هر کلمه ای رو نوشت!

فکر کنم بهترین راه اینه که عملیات خواندن ونوشتن فایل روی دیسک رو به حداقل برسونی و برطبق کد و منطق طراحی برنامت که نوشتی باید این بهینه سازی رو انجام بدی .

به هر حال فکر کنم یکی از دلایلی که دیتابیس اومد به بازار سختی کار کردن با این همه فایل بوده!

امیدوارم با این توضیحات (در حد دانش من) مشکلت حل بشه!

farnaz2003
پنج شنبه 19 بهمن 1385, 12:23 عصر
جناب صالحی ممنون از راهنمایی تون .
فایل کلمه رو یکبار که نه و لی تونستم تعداد دفعات باز کردنش را به 100 بار کاهش بدم.
در ضمن من دیتابیس رو دست کم نگرفتم اونی کار رو براش انجام میدم دست کم گرفته و یا به قول خودش می خواد بی نیاز از دیتابیس باشه.