PDA

View Full Version : سوال: مشکل با حجم عکسهای دیتابیس



mahdidabaghi
چهارشنبه 11 مرداد 1391, 00:32 صبح
با سلام خدمت دوستان گل خودم
یه پروژه واسه یه ارگان نوشتم که صفحه ثبت اون 60 تا فیلد داره از انواع مختلف که 4 تا عکس هم داره
حالا مشکل من اینه که اگه خود عکس ها رو تو دیتابیس ذخیره کنم حجم اون خیلی زیاد میشه (لازم به یاد آوریه که حدود 50000 اطلاعات قراره وارد دیتابیس بشه) و تو سلکت گیریام هم سرعت میاد پایین(البته زمانی که سلکتمو بدون عکس ها واسه این تعداد اطلاعات میگیرم تو 10 ثانیه کل اطلاعات میاد البته یه پروسیجر خفن آلود واسش نوشتم:ولی زمانی که با عکس ها سلکت میگیرم رو 20000 تا اطلاعان زمان طولانی میشه چه برسه به 50000 تا)
اگه هم ادرس ذخیره کنم بحث شبکه بودن و مشکل پاک شدن احتمالی عکس ها مطرحه
ممنون میشم از اساتید محترم که راهی جلوی بنده قرار بدن
با تشکر

mahdidabaghi
چهارشنبه 11 مرداد 1391, 01:41 صبح
دوستان ممنون میشم کمکم کنین اخه بد جور کارم گیره

hakim22
چهارشنبه 11 مرداد 1391, 09:06 صبح
اولا که خود SQL server قابلیتی داره به نام Filesystem که شما می توانید دیتابیس ها و یا جداولی داشته باشید که فیلدهایش به صورت فایل ذخیره می شوند و محدودیتی هم در حجم فایلها وجود ندارد ( مقدار پیشفرضش تا 2 گیگابایت فضا به یک فیلد اختصاص می دهد) این یعنی Sql server کاملا آماده ی پذیرش و جستجوی داده هایی از این قبیل هست و برایش برنامه دارد !!!

پیشنهاد اول اینه که عکسها رو نرمال کنید یعنی اونها را به صورت مجزا در یک جدول دیگه ذخیره کنید و با یک Relation به جدول اصلی ارتباط رو بر قرار کنید. مثلا اگر اینها عکس کاربرها باشند. ID کاربر رو به جدول عکس ها ارتباط بدید.

در حالت الان به نظر میرسه شما وقتی datatable رو fill می کنید یا یک select * اینکارو می کنید. خب حجم عکسها زیاده و پر کردن جدول وقت گیر میشه . بجاش
یک متدی بسازید مثل FillByUserID که هر وقت شماره ی کاربری رو دادید بره و اون شماره رو پیدا کنه و فقط همان یک عکس را از دیتابیس بخونه. این بهینه ترین حالت دریافت اطلاعات از سرور است.

تا زمانی که اطلاعات شما در فایلهایی با کمتر از 8 مگابایت باشه نیازی نیست به سراغ روش file system برید. حتی در اون شرایط هم با توجه به تجربم در نوشتن برنامه ای که فایلهای تصویری با حجم های بالای یک گیگ رو در دیتابیس میریخت بازیابی می کرد اگر مورد به مورد بازیابی انجام بشه مشکلی پیش نمیاد ( به هر حال متمرکز کردن داده در یک مکان یک سری فواید و ضرر هایی دارد!)

cerezaei65
چهارشنبه 11 مرداد 1391, 11:36 صبح
ببخشید یه سوال! البته راهنمایی
من یه برنامه دارم که یه سری عکسهارو باید ذخیره کنه و هر وقت خواستم برگردونه!
مشکل اینجاست که تعداد عکسها یکم! زیاده حدود ده ملیون تا! متوسط حجم هر کدومم 300کیلو هست
به نظرتون بهترین کار چیه؟داخل دیتابیس یا پوشه شیر یا filesyste?

hakim22
چهارشنبه 11 مرداد 1391, 15:51 عصر
داخل database
گفتم که همونطور که خود SQL میگه برای فایلهای تا حجم 8 مگابایت عملیات ذخیره و بازیابی اطلاعات در یک فیلد مشکلی نداره و بهینه حساب میشه.
فقط برای گزارش گیری از database سعی کنید از روشی که گفت استفاده کنید و مورد به مورد fill کنید.

mahdidabaghi
چهارشنبه 11 مرداد 1391, 17:39 عصر
از شرکتتون توی بحث بینهایت ممنونم
مشکل اینه که کاربرای برنامه من میخان یه گزارش کلی از اطلاعات داشته باشن یعنی همون 50000 تا اطلاعات
در مورد ایجاد جداول جداگانه برای عکس ها هم با شما موافقم و من هم همین کارو انجام دادم
حالا به نظر شما چیکار کنم این مشکل رو؟

hakim22
چهارشنبه 11 مرداد 1391, 17:49 عصر
دوست عزیز اصلا انسان قادر نیست 5000 تا عکس رو باهم ببینه ! انسان در هر زمان فقط می تونه یک عکس رو ببینه
حتی محیط ویندوز هم شما همزمان به صورت thumbnail فقط 20 تا 40 عکس رو به صورت کوچک شده می بینید. یعنی عملا شما هیچوقت نیاز به گزارشی به اون حجم ندارید.
نهایتا 50 تا 50 تا عکسها رو به روی یک Object یا لیست اصطلاحا Map می کنید و بعد اونهارو نمایش یا چاپ می کنید. حتما کد خودتون رو Just in time بنویسید یعنی هرجا لازم به نمایش اطلاعاتی داشتید همون اطلاعات رو از دیتابیس بازخوانی کنید.

mahdidabaghi
چهارشنبه 11 مرداد 1391, 18:38 عصر
بازم ممنون از پاسخ شما
اخه مشکل اینه که کاربرای من میخان یه گزارش کلی بگیرن از 50000 اطلاعات که گزارشو با کریستال ریپورت انجام دادم و یه سلکت خوب همون جور که قبلا گفتم به گزارش پاس میدم
ولی لود اون با توجه به عکس ها زیاد طول میکشه
مشکل اینه
بازم پیشاپیش از کمکتون ممنونم...!!!!!!!!!!

mahdidabaghi
چهارشنبه 11 مرداد 1391, 18:43 عصر
اگه میشه در مورد map کردن هم یه توضیحی بدین چجوری میشه 50 تا 50 تا این کارو انجام بدم؟
یکی از دوستان میگفت با استفاده از نخ ها 1000 تا 1000 تا به برنامه پاس بدم و از خاصیت sleep نخ ها واسه این عمل استفاده کنم
شما نظرتون چیه؟

hakim22
چهارشنبه 11 مرداد 1391, 19:07 عصر
mapping یعنی شما بیای و داده ای دیتابیس رو روی یک شی منتقل کنی تا بجای int و string خصوصیات شی رو استفاده کنی مثلا داده های کاربر رو روی یک شی کاربر منتقل کنی و در برنامه همیشه از اشیا استفاده کنی نه از خود دیتابیس و گزارش گیری مستقیم.
اون که 50 تا 50 تا نشون بدی یعنی میخوای قابلیت paging رو به اینترفیس برنامه اضافه کنی و داده ها رو قطعه قطعه گزارش بگیری.
شما تعداد رکوردهارو درمیاری بعد لیست اونها رو به یک حالتی (مثلا تاریخ ذخیره شدن یا شماره ID) مرتب می کنی بعد با تقسیم تعداد کل بر عدد 50 تعداد صفحاتی که باید نشون بدی بدست میاد. مثل همین سایت که اگر پستها زیاد باشه به صفحه ی بعدی میریم . روش خوبیه که زمان کاربر رو کمتر بگیریم. و عملا چیزی نشونش بدیم که بدردش بخوره
بعد توی برنامه قابلیت search بزارید که کاربر بتونه جستجو کنه بجای نمایش داده های زیاد بی ربط.
در آخر شما میای 50 تای اول لیست رو نمایش میدی بعد وقتی کاربر صفحه ی 2 رو میخواد شما از ردیف 51 تا 100 رو گزارش میگیری ( این کار هم میشه مستقیما از دیتابیس انجام داد هم با استفاده از اشیای برنامه و لیست های Generic)

mahdidabaghi
چهارشنبه 11 مرداد 1391, 21:29 عصر
مرسی ازتون واقعا
فقط اگه امکانش هس میشه یه نمونه واسه paging بذارین
اخه تو این زمینه کار نکردم
یه دنیا شرمنده و ممنون

mahdidabaghi
چهارشنبه 11 مرداد 1391, 22:41 عصر
دوستان کسی نیس یه نمونه از paging بذاره ؟؟؟؟؟؟؟؟؟؟؟؟؟
ممنون میشم کمک کنید

mahdidabaghi
پنج شنبه 12 مرداد 1391, 11:29 صبح
تو نت زیاد دنبال paging گشتم ولی نمونه خوبی گی نیوردم
اگه از اساتید کسی بلده لطف کنه یه نمونه بذاره یا توضیح جامعی بده

FastCode
پنج شنبه 12 مرداد 1391, 13:20 عصر
سلام
نظر من:
http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

mahdidabaghi
پنج شنبه 12 مرداد 1391, 13:45 عصر
ممنوم
میشه یه توضیحیم بدین اینو یا یه سر نخی بدین...

tooraj_azizi_1035
پنج شنبه 12 مرداد 1391, 15:20 عصر
سلام
شما باید از قابلیت FILE STREAM در SQL Server استفاده کنی که باعث میشه فایل ها در دیتابیس ذخیره نشن بلکه در سیستم فایل ذخیره می شن.
FILESTREAM (SQL Server) (http://msdn.microsoft.com/en-us/library/gg471497.aspx)

mahdidabaghi
پنج شنبه 12 مرداد 1391, 22:51 عصر
فک کنم با paging میشه سرعت رو به حد خوبی رسوند
اگه میشه یکی این paging رو توضیخ بده

FastCode
پنج شنبه 12 مرداد 1391, 23:47 عصر
paging خوبه ولی پروژه های دولت ایران غیافشون به کلمه enterprise نمیخوره که کسی بخواد وقت بزاره ۶۰۰ تا کلاس طراحی کنه که آقای ريیس ۴ ثانیه زودتر گزارش رو ببیینه

no offense
no pun intended

mahdidabaghi
جمعه 13 مرداد 1391, 00:05 صبح
حرف شما منطقی
ولی مشکل اینه که اداره ای که با اون قرارداد دارم و برنامه رو نوشتم واسشون میگن باید سرعت اجرای گزارشا رو بیارم بالاتر وگرنه پول B پول
واین یعنی ...

amir4015
جمعه 13 مرداد 1391, 00:21 صبح
سلام
چرا عكسارو داخل يك پوشه همراه نرم افزار قرار نمي دي و اسم فايل ها رو به ديتابيس بدي؟؟؟؟؟؟؟؟؟؟

mahdidabaghi
جمعه 13 مرداد 1391, 11:13 صبح
سلام چون در این صورت هم ممکنه عکس ها پاک شن و هم تو شبکه کردن برنامه به مشکل میخورم (مثلا طرف ادرس عکس رو میده که خودش یه سیستم کلاینته) حالا چجوری 20 تا سیستم اونور تر که اونم یه کلاینته به آدرس این عکسه دسترسی داشته باشه؟ و دلیل آخرم این که ادرس عکس رو تا حالا خودم تو db ذخیره نکردمو و نمیدونم چجوری میشه این آدرسو 2 باره به عکس تبدیل کنم و تو کریستال نشون بدم (خیلی سرچ زدم تو این زمینه و یه نمونه خوب پیدا نکردم)

amir4015
یک شنبه 22 مرداد 1391, 15:38 عصر
دوست عزيز ادرس يا ايپي عكس رو كه بدي بجاي 20 كامپيوتر 1000 كامپيوتر مي تونن ببينن
درضمن ادرس به صورت يك متن مي دي و به صورت متن مي گيري و هرجا كه خواصتي نشون مي ديدي

tooraj_azizi_1035
یک شنبه 22 مرداد 1391, 18:11 عصر
توجه کردی من چی گفتم؟

amir4015
دوشنبه 23 مرداد 1391, 17:18 عصر
با مني؟؟!!؟؟

tooraj_azizi_1035
دوشنبه 23 مرداد 1391, 17:21 عصر
آره گفتم با FILESTREAM باید کار کنی: http://msdn.microsoft.com/en-us/library/cc645583

amir4015
دوشنبه 23 مرداد 1391, 17:24 عصر
ببخشيد من فقط تيتر و چند تا از كامند ها رو خوندم مال شما رو نديدم

amir4015
دوشنبه 23 مرداد 1391, 17:25 عصر
حالا اگه نخوايم اسم سخت بهش بديم مي شه دادن ادرس محل ذخيره شدن عكس ها