View Full Version : ذخیره کردن حجم زیادی دیتا با سرعت بالا ؟؟؟
Moharram
یک شنبه 13 آبان 1386, 18:41 عصر
سلام،
من یه سخت افزار دارم که با سرعت 300 مگابایت در ثانیه (!!!) بهم دیتا میده، و باید بتونم این حجم زیاد را تو هارد ذخیره کنم.
به نظرم رسید که یه بافر خیلی بزرگ بذارم و با یه Thread (مثلا موازی) از بافر بخونم و تو فایل بریزم و بافر بصورت یه FIFO بشه. یعنی هی پر و خالی بشه...
حالا مشکل اینجاس که نوشتن تو فایل از دریافت دیتا عقب میافته. مثلا 4 بار 50 مگابایت دریافت میکنم ولی در این مدت مثلا 35 مگابایت نوشتم و این سرعت نوشتن هی کمتر هم میشه.
اگه راه دیگه ای سراغ دارین لطفا راهنمایی کنین. با تشکر
Nima_NF
یک شنبه 13 آبان 1386, 22:34 عصر
روش خوبی است ولی فرق سخت افزار ها و محدودیت آن ها در همین جاست. سرعت ram بسیار بالا تر از سرعت هارد دیسک هست به خاطر همین هرگز نمی توانید آن دو را با هم مقایسه کنید.
اگر نرم افزار شما نیاز به چنین سرعتی دارد و کار دریافت چنین میزان دیتایی باید برای مدت کوتاهی انجام شود ، راه مناسب داشتن بیشترین میزان ممکن ram هست(مثلا امروزه با کامپیوتر شخصی به راحتی تا 8GB) و اطلاعات خودتان را در آن با نهایت سرعت ذخیره کنید و سپس در موقع مناسب شروع به ذخیره در هارد دیسک کنید .
اما اگر هدفتان ذخیره سازی real-time می باشد آنگاه همه چیز باید قوی باشد یعنی همان سیتم مورد نیاز برای کار real-time شما ،مثلا هارد دیسک باید از سری پر سرعت RPM 15,000 باشد که گرانقیمت است.) پردازنده نیز که مسلما بالاترین میزان ممکن و از سری چند هسته(2 و 4 و...) باید باشد تا عمل موازی سازی با نهایت سرعت انجام شود.در هر صورت انتظار نباید داشته باشد که بتوانید دیتا را به همان سرعت ram در هارد دیسک ذخیره کنید.
Inprise
یک شنبه 13 آبان 1386, 22:51 عصر
در این موارد معمولا گلوگاه اصلی میزان حافظه و سرعت پردازنده نیست . سرعت چرخش هد دیسک هم مطلقا بی ربط است . عموما وقتی با مسائلی مثل این درگیر هستید عرض باند باس های مختلف بین مبدا و مقصد مهمترین و موثرترین گلوگاه هست . مثلا وقتی سیصد مگابایت در ثانیه دریافت میکنی ، با این فرض که رابط ات واقعا چنین باس و کلاکی دارد ، باید ببینی که آیا PCI Bus و FSB مناسبی هم روی مادر بردت وجود داره یا نه . مادربردهای معمولی عموما چنین توانی رو ندارن چون به عنوان مثال روی اغلبشون PCI Bus ای نصب شده که با 32 مگاهرتز کلاک کار میکنه و حداکثر میتونه عرض باند دیجیتال 130 مگابیت رو بهت بده . بعد از این نوبت به کنترلر دیسک میرسه . از چه نوع هاردی استفاده میکنی ؟ IDE ؟ طبیعتا چنین عرض باندی رو ساپورت نمیکنه ، SCSI ؟ اون هم همینطور . انواع مختلفی از SATA وجود داره که بعضیهاشون این عرض باند رو حمایت میکنن به این شرط که باس و اف اس بی مناسب وجود داشته باشه . فایبر چنل هم فوق العاده گران قسمت است و نباید بسادگی حتی بهش فکر کرد . حتی با وجود باس و اف اس بی مناسب و وجود کنترلر دیسک مناسب ( ساتا یا فایبر چنل ) 32 یا 64 بیتی بودن پردازنده هم موثر هست ؛ بدون اینکه تعداد پردازنده در مسائلی از این قبیل اهمیت داشته باشه باید بدونی با 32 بیت نمیتونی 300 مگابایت در ثانیه رو اصولا پردازش کنی و کلاک پردازنده ات اگر از سه گیگا هرتز کمتر باشه حتی ترافیک PCI Bus 32bit رو هم نمیتونی کامل پردازش کنی ؛ بعد از این کلاک حافظه ات مطرح هست .
تجربه من در چند پروژه از این دست حداقل نشون میده اولین مسئله برای حل کردن معماری مناسب سخت افزار است ، و بعد نگرانی در مورد نرم افزار . در صورت وجود معماری مناسب بین تعدادی انتخاب نرم افزاری مخیر هستی اما تا رسیدن به محلی که حتی بتونی به گلوگاه های نرم افزارت فکر کنی مسیر طولانی ای وجود داره .
بطور خلاصه در مسائلی مثل این ، اول از همه باید کلیه اجزاء سیستم توان شارش داده های ورودی رو داشته باشن که عرض باند و کلاک هر کدوم باید "قبل از هر چیز" در نظر گرفته بشه ؛ حالا اگر معماری سخت افزاریت با مواردی که گفتم ( و خیلی خلاصه و مجمل و ناقص بود به دلیل کمبود وقت ) تناسبی نداره بهتره وقتت رو روی فکر کردن به برنامه ات نذاری .
Moharram
چهارشنبه 16 آبان 1386, 16:35 عصر
با تشکر از اینکه تو تاپیک شرکت کردید، اجازه بدید یه کم بیشتر توضیح بدم:
Hardware : PCI Express
HARD : RAID(6*SATA)
RAM : 3GByte
CPU : AMD Dual Core 3.00GHz
در ضمن Thread رو هم با تابع AfxBeginThread میسازم و در تابع Thread یه حلقه بینهایت دارم و با استفاده از یه سری Flag وقتی دیتا باشه یه Write To File انجام میدم.
برای Write کردن هم از متد Write که تو کلاس CFile وجود داره استفاده میکنم.
سوال 1: آیا برای کار کردن با RAID نرم افزار خاصی باید نصب باشه؟؟ (مثلا SDKای ، چیزی)
سوال 2: در مورد اون Thread که گفتم آیا درست نوشته شده و میتونه Parallel عمل کنه؟؟
Folaani
چهارشنبه 16 آبان 1386, 21:05 عصر
ببخشید البته بنده وارد نیستم و تجربه ای ندارم؛ حال بصورت سوال یا همفکری هرکدوم در نظر بگیرید میخواستم بپرسم ممکن نیست مثلا دوتا یا بیشتر هارد دیسک داشته باشیم و این همه دیتا رو طوری بینشون تقسیم کنیم؟
چون محدودیت هارد فرضا تعداد دورش هست و پنهای باند گذرگاهش و اینطور چیزها. اینها هم که با چنتا شدن، اگر بقیهء بخشهای سیستم محدودیتی ایجاد نکنه برطرف میشه.
این RAID هم خودش انواع داره خب، مال شما از چه نوعیه؟ دیتا رو خودش تقسیم میکنه بین هاردها؟
راستی این سخت افزار شما چی هست؟ عجیب نیست که تنظیمی، کنترلی، پروتکلی چیزی نداشته باشه فقط دیتا رو بریزه بیرون؟!! اونم با این حجم که خیلی سخت افزارها ممکنه نتونن جوابش رو بدن.
Inprise
چهارشنبه 16 آبان 1386, 21:16 عصر
اجازه بدید یه کم بیشتر توضیح بدم
توضیحی که دادی لااقل متناسب با جواب من نبود و کمکی نمیتونم بهت بکنم .
به عنوان یک توضیح نسبتا نامربوط ، RAID ها حتی اگر سخت افزاری باشن و کنترلر خوبی هم روی برد وجود داشته باشه باز تاثیر کیفیتی منفی "فوق العاده" زیادی دارند . عموما" سرورهائی که نیاز به نگهداری و ذخیره و انباره اطلاعات دارند به RAID مجهز میشن . یک ماشین پرسرعت _ به عنوان مثال_ برای یک کار کنترلی با حجم بالا به RAID نیازی نداره و این حتی یک عامل منفی است . برای حفاظت از اطلاعات آرشیو گیری دوره ای و استفاده از یک NAS روی شبکه برای Replication قابل توصیه هست . برای بقیه به جمله اول رجوع کن
Moharram
یک شنبه 20 آبان 1386, 16:02 عصر
تا جائیکه من میدونم یه نوع RAID برای Mirror کردن وجود داره که بهش RAID 1 هم میگن و هارد رو دو قسمت میکنه و همه چیزو دوبار مینویسه....
اما یه نوع دیگه هم بنام RAID 0 یا Striping وجود داره که اطلاعات رو به صورت پارالل، رو مثلا دو تا هارد (یا بیشتر) مینویسه و سرعت بیشتر میشه.
من تونستم 6 تا هاردو بصورت RAID 0 بهم متصل کنم که در نتیجه یک درایو با حجم 850GB درست شده، اما سرعت چندان تغییر نکرده.
illegalyasync
دوشنبه 21 آبان 1386, 12:08 عصر
سرعت نوشتن خیلی کم میشه سرعت Seek هم کم میشه اما اگه ساتا باشه خیلی به چشم نمیاد . مشکلت رو اینپی گفت و به نظرم دقت نکردی
Moharram
یک شنبه 27 آبان 1386, 18:31 عصر
من فکر کنم به جواب رسیدم ...
با استفاده از توابع API به سرعت 550MBps میشه رسید.
int x;
DWORD y;
HANDLE FileHandle;
FileHandle = CreateFile(filename,GENERIC_WRITE,0,NULL,CREATE_AL WAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING ,(HANDLE)NULL);
x = WriteFile(FileHandle,(LPVOID)(Array),2*1024*1024,( LPDWORD)
نکته در باز کردن فایل در مد FILE_FLAG_NO_BUFFERING بود. در ضمن این عکس هم مربوط به نتایج یه BenchMark روی این هارده.
همینطور که تو چارت دیده میشه با استفاده از این روش میشه از BenchMark هم سریعتر نوشت.
نتایج یک BenchMark رو برای این هاردها ببینید ...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.