PDA

View Full Version : مقایسه خواندن عکس از دیتابیس در مقابل خواندن از هارد



SoheilKH
شنبه 13 آبان 1385, 18:34 عصر
سلام
می خواهیم یک عکس را به کاربر نمایش دهیم از نظر Performance بهتر است از دیتا بیس لود شود و به کاربر نمایش داده شود یا اینکه عکس در یک فایل ذخیره شود و به کاربر نمایش داده شود.
اجازه بدهید مسئله را به طور بهتر بگم
توی یک پروژه وب قرار است که تصاویر به کاربران نمایش داده شود بهتر است تصاویر از دیتا بیس لود شود و به سمت کاربر فرستاده شود یا اینکه عکس مستقیما از فایل خوانده شود(یعنی در داخل کد Html آدرس عکس داده شود.)

با تشکر

oVERfLOW
یک شنبه 14 آبان 1385, 09:21 صبح
سلام علیکم

خوب مسلمه که خوندن عکس از یه مسیر روی دیسک خیلی سریع تره
برای خوندن عکس از دیتابیس چندین مرحله سرعت پایین می‌آد و علاوه بر اون فشار اضافی و بی مورد بر روی سرور وارد می‌شه

علاوه بر اون امکان کش کردن تصویر هم از بین می‌ره چون دیگه مرورگر نمی‌دونه که این فایل PHP که شما دارید اجرا می‌کنید فقط یه عکس رو بهش بر می‌گردونه و هر بار باید دانلودش کنه

SoheilKH
یک شنبه 14 آبان 1385, 10:07 صبح
سلام
خیلی ممنون از جوابت
من هم با نظر شما موافقم اما چند تا نکته هست که باید توجه داشت

SqlServer برای عمل I/O از OS استفاده نمی کنه و خودش دستورات خاص خودش را داره و مثل اینکه سرعت خواندن و پردازش اطلاعات توسط SqlServer سریعتر از OS است .
چون تصاویر به صورت Image در دیتا بیس ذخیره می شوند و برای Fetch کردن آنها تقریبا نیاز به پروسس سنگینی نیست . میشه گفت شاید SqlServer سریعتر است .
یعنی پردازش خواندن عکس از روی هارد زیاد تر از SqlServer است

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


آیا مقاله ای یا منبعی در این مورد سراغ داری

AminSobati
یک شنبه 14 آبان 1385, 11:36 صبح
من در مورد وب تخصصی ندارم، یک سوال: به صورت مستقیم چجوری میشه تصویر رو از DB به HTML لینک کرد؟ یعنی بدون Save کردنش بصورت موقتی روی دیسک؟ اگر مکانیزمش رو توضیح بدین من هم میتونم راهنمایی کنم که کدوم روش بهینه تره

سنبله کار
یک شنبه 14 آبان 1385, 12:40 عصر
برای تصاویری که ارزش سندی داشته و نیاز به امنیت بالایی دارند فکر می کنم استفاده از DB مناسبتر باشه .

SoheilKH
یک شنبه 14 آبان 1385, 14:38 عصر
سلام

به صورت مستقیم چجوری میشه تصویر رو از DB به HTML لینک کرد؟ یعنی بدون Save کردنش بصورت موقتی روی دیسک
اطلاعات باینری از تصویر را از دیتابیس لود می کنی و در نهایت به وسیله Response.BinaryWrite به سمت Request میفرستی
مثلا

byte[] ImageData ;
Response.BinaryWrite(ImageData);
//یا
Response.OutputStream.Write(ImageData, offset,count);


ImageData همون چیزی است که توی دیتابیس ذخیره شده است

AminSobati
یک شنبه 14 آبان 1385, 15:11 عصر
سلام

اطلاعات باینری از تصویر را از دیتابیس لود می کنی و در نهایت به وسیله Response.BinaryWrite به سمت Request میفرستی
مثلا

byte[] ImageData ;
Response.BinaryWrite(ImageData);
//یا
Response.OutputStream.Write(ImageData, offset,count);


ImageData همون چیزی است که توی دیتابیس ذخیره شده است
پس با این حساب چه خواندن تصویر از فایل و چه از داخل دیتابیس به یک اندازه IO روی دیسک قرار میده. به نظر نمیرسه جدا بودن فایلها از نظر Performance ضعفی ایجاد کنه. ولی در بعضی پروژه ها، این ایده آله که وقتی از دیتابیس Backup میگیرند، تصاویر هم به صورت یکپارچه Backup گرفته بشه. این دقیقا برای بعضی سناریوها ضعف به حساب میاد چون معتقدند که حجم دیتابیس زیاد میشه و قصد ندارند تصاویر در Backup گنجانده بشه. صرف نظر از حجم، ذخیره تصاویر در دیتابیس محاسنی داره مثلا اینکه Read/Write بصورت Transactional میشه و این فیلدها در Replication هم میتونن شرکت کنن...

SoheilKH
یک شنبه 14 آبان 1385, 16:45 عصر
مثلا اینکه Read/Write بصورت Transactional میشه و این فیلدها در Replication هم میتونن شرکت کنند
میشه بیشتر توضیح بدهید .منظور از Transactional یعنی چه.

یعنی هیچ فرقی بین خواندن از دیتابیس و فایل نمی کنه؟
برای خواندن از دیتابیس باید Connection باز شود . Packet های مربوط به Security رد و بدل شود و داده (عکس) از دیتابیس خوانده شود. سپس به صورت Packet شده به سمت Web Server فرستاده شود و در آنجا Packet ها به ImageData (همونی که توی post قبلی ام نوشته ام ) تبدیل شود. سپس در آنجا به سمت کاربر فرستاده شود.
حال این رو هم در نظر بگیرید در وب معمولا data base Server از Web Server جدا است.یعنی فشار شبکه را هم در نظر بگیرید
و اینکه هم زمان شاید چندین کاربر درخواست مشابهی داشته باشند.

اما برای خواندن از فایل فکر نمی کنم تا این حد پروسس انجام شود(در مورد نحوه عملکرد web server در این اطلاعی ندارم اگر لینک خوبی دارید ممنون می شوم معرفی کنید)

shayan_delphi
یک شنبه 14 آبان 1385, 21:58 عصر
یه راه حل هم اینه که شما عکسها را در یک سایت مجانی عضو بشی و در اونجا ذخیره کنی و عکسها از اونجا در صفحه شما لود بشه.

SoheilKH
دوشنبه 15 آبان 1385, 09:49 صبح
یه راه حل هم اینه که شما عکسها را در یک سایت مجانی عضو بشی و در اونجا ذخیره کنی و عکسها از اونجا در صفحه شما لود بشه.

خیلی ممنون از پیشنهادت
فکر کنم منظورت Image Server بود یعنی عکس از یک سرور دیگه لود بشه
اما با این حال من می خواهم تفاوت لود شدن از دیتابیس و هارد را بدونم
من خودم عکس ها را در دیتابیس ذخیره می کنم و برای لود شدن از هارد استفاده می کنم.
یعنی ابتدا تصویر در با سایز کامل در دیتابیس ذخیره می شود و در هنگام لود شدن اگر فایل در هارد بود که به سمت اش فرستاده می شود و اگر نبود از دیتابیس می آورم و سپس در هارد ذخیره می کنم .سپس به سمت اش می فرستم
هدف من از ذخیره کردن در دیتابیس هم تولید عکس با Size های مختلف است.

AminSobati
دوشنبه 15 آبان 1385, 14:33 عصر
میشه بیشتر توضیح بدهید .منظور از Transactional یعنی چه.

یعنی هیچ فرقی بین خواندن از دیتابیس و فایل نمی کنه؟
برای خواندن از دیتابیس باید Connection باز شود . Packet های مربوط به Security رد و بدل شود و داده (عکس) از دیتابیس خوانده شود. سپس به صورت Packet شده به سمت Web Server فرستاده شود و در آنجا Packet ها به ImageData (همونی که توی post قبلی ام نوشته ام ) تبدیل شود. سپس در آنجا به سمت کاربر فرستاده شود.
حال این رو هم در نظر بگیرید در وب معمولا data base Server از Web Server جدا است.یعنی فشار شبکه را هم در نظر بگیرید
و اینکه هم زمان شاید چندین کاربر درخواست مشابهی داشته باشند.

اما برای خواندن از فایل فکر نمی کنم تا این حد پروسس انجام شود(در مورد نحوه عملکرد web server در این اطلاعی ندارم اگر لینک خوبی دارید ممنون می شوم معرفی کنید)
Connection یکبار باز میشه و Authenticate میکنه! ارسال Packetها، تبدیل شدن به فایل در سمت Client در هر دو حالت صورت میگیره. ولی مگه شما چند عکس با چه حجمی در واحد زمان قصد دارید تبادل کنید که تا این حد نگران هستین!

SoheilKH
دوشنبه 15 آبان 1385, 16:20 عصر
فرض کن یه توی صفحه اول سایتت می خواهی عکس 10 تا محصول برتر را نمایش دهی.
تا اینجا درست.
اما اگر تعداد کاربران سایتت بالا بره مسئله فرق می کنه.برای هر کاربر 10 بار مراحل قبل انجام می شه .
و در ضمن امکان داره کاربر های دیگه در حال انجام کارهای دیگه ای که داره به Sql فشار می یاره باشند.

نگرانی من هم از افزایش کاربران سایت و Down شدن سرور هستم.

با تشکر

AminSobati
دوشنبه 15 آبان 1385, 21:24 عصر
انتقال این حجم اطلاعات در شبکه LAN ما بین IIS و SQL Server زیاد نیست ولی اطلاع ندارم شبکه بین این دو در سناریوی شما به چه صورته. میتونین تصاویر رو روی کامپیوتر دیگه ای قرار بدین اصلا، ولی باز هم بعید میدونم ضروری باشه. قائدتا حجم تصاویر شما زیاد نیست چون در وب دارید کار میکنید

mohsen_mavaddat
چهارشنبه 10 بهمن 1386, 03:12 صبح
تشکر برای مباحثی که در اینجا مطرح شده و یک سوال ؟
برای الحاق نمودن فایل ها ی مختلف به مدارک چه راهی پیشنهاد می کنید

با توجه به این که در یک شبکه محلی کلاینت ها بتونند به راحتی الحاقات را دانلود کنند (بدون استفاده از SoKET)

و در وب هم دانلود راحت باشه ؟

بهتره فایل ها در db ذخیره بشه یا روی هارد سرور؟؟؟

فرض کنید یک برنامه مدیریت منابع دارید و کلاینت ها به واسطه SQL server 2005 با سرور در تماس هستند.

hamed_antiphp
چهارشنبه 10 بهمن 1386, 04:22 صبح
با سلام خدمت دوستان
خوب با توجه به سرعت اینترنت لاک پشتی ایران و در کل هر چه ارتباط و واکشی (fetch) از database کمتر باشه خیلی بهتره
اول - اینکه یک رفت و برگشت به سرور برای اتصال و واکشی رکوردها داریم
2 - عکسی که تویی بانک ذخیره شده به صورت دو دویی هستن پس برای هر عکس یک تبدیل هم داریم (binery to pic) خوب چقدر زمان میبره ؟؟ چقدر عملیات لازم داره ؟؟

به نظر من و کاری که خودم انجام میدم و سرعتش هم خوبi
وقتی می خواهم یک عکس برای محصول ثبت بشه .
عکس با کد محصول روی هاست ذخیره میشه و هنگام نمایش محصولات رکورد از بانک واکشی میشه و عکس بر اساس کد محصول از روزی هاست لود میشه
مثلا
محصول با کد mdl66sf3ok یک فایل عکس mdl66sf3ok.gif روی هاست داره .
shopid :
mdl66sf3ok عکس مرتبط mdl66sf3ok.gif یا mdl66sf3ok.jpg یا mdl66sf3ok.png ......

AminSobati
چهارشنبه 10 بهمن 1386, 21:47 عصر
حامد جان سرعت اینترنت در این موضوع دخیل نیست. چه از فایل و چه از دیتابیس به هر حال Data باید به کلاینت Download بشه. ذخیره تصویر در دیتابیس برای Web Application یک عیب داره و اون اینکه Temp File براش ایجاد میشه. طبیعتا چون حجم تصاویر معمولا برای Web کوچک هست، این رو عیب قابل توجهی که از ذخیره عکس در دیتابیس اجتناب بشه، تلقی نمیکنیم.

hamed_antiphp
پنج شنبه 11 بهمن 1386, 01:11 صبح
با سلام مجدد
خوب امین جان حرف درست که باید دانلود بشه عکس این روی سرعت تاثیری نداره .
اما عیب این روش توی تبدیل کد دودویی به عکس هستن که زمان زیادی میبره تویه یک سایت با 20 تا عکس که از بانک لود میشه خلیلی تاثیر داره ..
هر روشی هم عیب داره هم حسن داره .
و شما میدونید که هر چی ارتباط با بانک کمتر باشه سرعت بالا تر میره

به زودی سایت جدیدم میاد بالا www.mycom.ir (http://www.mycom.ir) .
تکنیک های خوبی توش به کار بردم که سر فرصت ایجا میزارم و توضیح میدم .
شاید بکار بیاد .

AminSobati
پنج شنبه 11 بهمن 1386, 11:36 صبح
سرعت واکشی تصویر از فایل و دیتابیس تفاوت محسوسی نداره (در Desktop Application) و همونطور که عرض کردم برای Web Application فقط درست شدن Temp File یک کار اضافی هست که انجام میشه

SabaSabouhi
شنبه 13 بهمن 1386, 15:04 عصر
با سلام

در کنار همه‌ى این مطالب که صحیح هم هستن یه چیزى رو هم در نظر داشته باشین و اون هم اینه که به طور معمول Serverى که پایگاه داده‌ها روى اون قرارداره دستگاه قوى‌ترى هست نسبت به دستگاهى که سرویس وب رو ارائه مى‌کنه یعنى حافظه‌ى اصلى بیشترى داره و دیسک سختش هم به انواع RAID مجهز هست و اغلب هم SCSII هست. که در این صورت کار خوندن اطلاعات از DB مى‌تونه از سرعت بیشترى برخودار باشه.

صبا صبوحى