PDA

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



vahid78
چهارشنبه 27 بهمن 1395, 16:34 عصر
با سلام و خسته نباشید خدمت همکاران

بنده قصد تعداد زیادی داکیومنت از پایگاه داده خودم که elasticsearch هست بخونم و در یک فایل اکسل ذخیره کنم
در هربار اکسپورت تعدادی رکورد بالای 1 میلیون هست
سیستم هم به این صورت طراحی شده که کاربر بر روی گزینه 'خروجی اکسل' کلیک میکنه میره و چند ساعت بعد میاد و خروجی خودش رو تحویل میگیره در حال حاضر برای تعداد رکورد زیر 100 هزارتا مشکل نداره ولی وقتی تعداد رکورد زیاد میشه ram‌زیادی از سرور میکشه و عملا دسترسی به سرور غیر ممکن میشه

من دو تا روش به ذهنم اومده برای ذخیره سازی رکورد ها بر روی اکسل میخواستم ببینم روش دیگه ایی هم داره یا نه
۱- گرفتن رکوردها از دیتابیس (ده هزارتا ده هزارتا) و ذخیره در یک آرایه و در انتها ایجاد فایل توسط php-excel
2- گرفتن ده هزارتا رکورد از دیتابیس و ایجاد فایل توسط php-excel و خواندن ده هزارتای بعدی و اضافه کردن به انتهای فایل توسط php-excel

من از اصلا سرعت اجرا برام مهم نیست فقط میخوام ram زیادی اشغال نشه

680100
چهارشنبه 27 بهمن 1395, 17:00 عصر
بایستی تعداد کمتری خروجی گرفت
یعنی یک میلیون رکورد رو هرچه ریز کنی از رم کمتری استفاده میکنی
مثلا از هر بار درخواست که میره سمت فایل اکسل 500 رکورد بگیری و پردازش کنی و 500 تای بعدی و ...
البته سوال پیش میاد که به ازای هر بار درخواست یک بار فایل اکسل بایستی لود بشه تا بشه خروجی گرفت
یه سری پارامترها هست که میشه بهش بگی از کدام رکورد بخون تا کدوم رکورد
نکته : هرچی از آیتم های بیشتر توی آرایه استفاده کنی از رم بیشتری مصرف میکنی

vahid78
چهارشنبه 27 بهمن 1395, 17:10 عصر
بایستی تعداد کمتری خروجی گرفت
یعنی یک میلیون رکورد رو هرچه ریز کنی از رم کمتری استفاده میکنی
مثلا از هر بار درخواست که میره سمت فایل اکسل 500 رکورد بگیری و پردازش کنی و 500 تای بعدی و ...
البته سوال پیش میاد که به ازای هر بار درخواست یک بار فایل اکسل بایستی لود بشه تا بشه خروجی گرفت
یه سری پارامترها هست که میشه بهش بگی از کدام رکورد بخون تا کدوم رکورد
نکته : هرچی از آیتم های بیشتر توی آرایه استفاده کنی از رم بیشتری مصرف میکنی

شما پیشنهاد میکنید من 500 تا بخونم بریزم تو فایل و بعد 500 تای بعدی؟

680100
چهارشنبه 27 بهمن 1395, 17:22 عصر
یه سوال
آیا این فایل اکسل ثابت هست ؟ و فقط میخواید این فایل رو پردازش کنید ؟
یا فایل داینامیک هست مثلا به ازای هر روز یک فایل وجود دارد ؟




اگر ثابت هست نظر من اینه که فایل اکسل رو ایمپورت کنی تو دیتابس و اندیکس گذاری مشخص و دقیق روی جدول بدید تا سرعت پردازش رو به حد خیلی زیاد بالا ببرید

من حدود 2 ماه پیش این مشکل رو داشتم که قیقا یک میلیون رکورد تو اکسل وجود داشت که بایستی پردازش میکردم
بهترین حالت برای من ساخت جدول و پیاده سازی فیلدهای مورد نیاز بود و اندیکس گذاری که سرعت کار من رو به حدی بالا برد
بدون اندیکس گذاری من روزانه 1000 تا 2000 رکورد می تونستم پردازش کنم که اندیکس گذاری تو عرض 2 ساعت کار پردازش من تمام شد
تو این حالت من 100 تا 100 تا رکورد از دیتابیس میگرفتم

vahid78
چهارشنبه 27 بهمن 1395, 17:46 عصر
یه سوال
آیا این فایل اکسل ثابت هست ؟ و فقط میخواید این فایل رو پردازش کنید ؟
یا فایل داینامیک هست مثلا به ازای هر روز یک فایل وجود دارد ؟


اگر ثابت هست نظر من اینه که فایل اکسل رو ایمپورت کنی تو دیتابس و اندیکس گذاری مشخص و دقیق روی جدول بدید تا سرعت پردازش رو به حد خیلی زیاد بالا ببرید

من حدود 2 ماه پیش این مشکل رو داشتم که قیقا یک میلیون رکورد تو اکسل وجود داشت که بایستی پردازش میکردم
بهترین حالت برای من ساخت جدول و پیاده سازی فیلدهای مورد نیاز بود و اندیکس گذاری که سرعت کار من رو به حدی بالا برد
بدون اندیکس گذاری من روزانه 1000 تا 2000 رکورد می تونستم پردازش کنم که اندیکس گذاری تو عرض 2 ساعت کار پردازش من تمام شد
تو این حالت من 100 تا 100 تا رکورد از دیتابیس میگرفتم

منظور من اینه ۱۰۰ تا رکورد از دیتابیس میگرفتیم میریختین تو اکسل یا نه توی ارایه نگه می داشتین اخرکار همشو باهم میریزین تو اکسل؟

680100
چهارشنبه 27 بهمن 1395, 18:00 عصر
منظور من اینه ۱۰۰ تا رکورد از دیتابیس میگرفتیم میریختین تو اکسل یا نه توی ارایه نگه می داشتین اخرکار همشو باهم میریزین تو اکسل؟

وقتی فایل اکسل رو تبدیل کردم به sql نیاز کارم نبود اون رو دوباره تبدیل کنم به اکسل (البته توی export گرفتن می تونی فرمت CSV اکسل رو انتخاب کنی و این فایل رو تبدیل کنی به اکسل) .
در کل کارهای من با دیتابیس بود .

از دیتابیس خروجی میگرفتم 100 تا 100 تا بعد به آرایه نسبت میدادم و از آرایه استفاده میکردم

vahid78
پنج شنبه 28 بهمن 1395, 07:18 صبح
من خودم دارم از دیتابیس خروجی میگیرم و نیازی ندارم که بریزم تو دیتابیس

فقط بهینه ترین حالت خروجی گرفتن برام مهمه

Unique
پنج شنبه 28 بهمن 1395, 10:10 صبح
من اصلا نمیدونم یک میلیون رکورد توی اکسل به چه دردی میخوره ! یعنی معمولا اطلاعات تفسیره شده و محدود شده و فیلتر شده را میریزن توی excel اما خوب اینم سناریویی هست برای خودش. تا حالا امتحان نکردم و نمیدونم دقیقا دنبال این هستی که mysql حافظه کمتری استفاده کنه یا php process.
نمیدونم تا حالا unbuffered query زدی یا نه ! اما میدونم که اگه unbyffered بزنی کل اطلاعات توی memory نمیاد و از سمت mysql میتونی یکی یکی fetch کنی. اینجا توی سایت php.net کامل توضیح داده. (http://php.net/manual/en/mysqlinfo.concepts.buffering.php)

vahid78
پنج شنبه 28 بهمن 1395, 17:56 عصر
من اصلا نمیدونم یک میلیون رکورد توی اکسل به چه دردی میخوره ! یعنی معمولا اطلاعات تفسیره شده و محدود شده و فیلتر شده را میریزن توی excel اما خوب اینم سناریویی هست برای خودش. تا حالا امتحان نکردم و نمیدونم دقیقا دنبال این هستی که mysql حافظه کمتری استفاده کنه یا php process.
نمیدونم تا حالا unbuffered query زدی یا نه ! اما میدونم که اگه unbyffered بزنی کل اطلاعات توی memory نمیاد و از سمت mysql میتونی یکی یکی fetch کنی. اینجا توی سایت php.net کامل توضیح داده. (http://php.net/manual/en/mysqlinfo.concepts.buffering.php)
دقیقا منم میدونم یک میلیون رکورد تو اکسل هیچ فایده ایی نداره ولی فقط مشتری هست دیگه پا فشاری زیادی رو این قسمت از کار داره

دیتای من تو mySQL نیست
من از Elasticsearch استفاده می کنم

Unique
جمعه 29 بهمن 1395, 00:22 صبح
وقتی توی انجمن PHP سوال میپرسی اصل را روی MySQL میگذارم ! متاسفانه چیزی از Elasticsearch نمیدونم اما میتونی توی stackoverflow در مورد مباحث memoey مرتبط بپرسی !

vahid78
جمعه 29 بهمن 1395, 17:55 عصر
وقتی توی انجمن PHP سوال میپرسی اصل را روی MySQL میگذارم ! متاسفانه چیزی از Elasticsearch نمیدونم اما میتونی توی stackoverflow در مورد مباحث memoey مرتبط بپرسی !
متاسفانه این یک فکر اشتباه هست که PHP پایگاه داده دیفالتش mySQL هست
من تو پست اولم ذکر کردم که از الستیک دارم داده هامو میخونم
و اسکریپتی که داره این اطلاعات را میخونه با PHP‌ نوشته شده


به هرحال ممنون از ارسال پاسختون

Unique
جمعه 29 بهمن 1395, 23:08 عصر
متاسفانه این یک فکر اشتباه هست که PHP پایگاه داده دیفالتش mySQL هست
دلیلش اینه که PHP بهترین همخوانی و پرفورمانس را با MySQL داره.


من تو پست اولم ذکر کردم که از الستیک دارم داده هامو میخونم
درست میگی ، تقصیر منه که به تازگی پست ها را کامل نمیخونم ! کار زیاد و. استرس و این حرفا ! ولی نمیتونم از اینجا هم دل بکنم !

680100
شنبه 30 بهمن 1395, 11:52 صبح
تا این لحظه فکر میکردم که میخواید داده های اکسل رو پردازش کنید .

شما خروجی اکسل میخواید از رکوردهای دیتابیس

یه راه حل پیشنهاد میدم

با استفاده از بافر کوئری (http://barnamenevis.org/showthread.php?535316-%D9%85%D8%B4%D8%A7%D9%88%D8%B1%D9%87-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%D8%A7%DA%A9%D8%B3%D9%84-%D8%AF%D8%B1-%D8%AA%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-%D8%A8%D8%A7%D9%84%D8%A7&p=2358544&viewfull=1#post2358544) که دوستومن اشاره کرد یا گرفتن xتا xتا رکورد از دیتابیس و append رکورد یا رکورد ها به فایل txt . هر رکورد در یک خط جدید PHP_EOL .
بعد این فایل تکست رو تبدیل کنی به اکسل
البته داده ها جوری توی فایل txt ذخیره بشند که بعدا بتونید جدا سازی کنید و هر کدوم فیلدها بره توی cell مربوط به خودش .

مثلا

1|نام و نام خانوادگی|سن|جنسیت|تحصیلات

اینجا با کاراکتر | میتونی این فیلدها رو از هم جدا کنید

vahid78
شنبه 30 بهمن 1395, 12:20 عصر
تا این لحظه فکر میکردم که میخواید داده های اکسل رو پردازش کنید .

شما خروجی اکسل میخواید از رکوردهای دیتابیس

یه راه حل پیشنهاد میدم

با استفاده از بافر کوئری (http://barnamenevis.org/showthread.php?535316-%D9%85%D8%B4%D8%A7%D9%88%D8%B1%D9%87-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%D8%A7%DA%A9%D8%B3%D9%84-%D8%AF%D8%B1-%D8%AA%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-%D8%A8%D8%A7%D9%84%D8%A7&p=2358544&viewfull=1#post2358544) که دوستومن اشاره کرد یا گرفتن xتا xتا رکورد از دیتابیس و append رکورد یا رکورد ها به فایل txt . هر رکورد در یک خط جدید PHP_EOL .
بعد این فایل تکست رو تبدیل کنی به اکسل
البته داده ها جوری توی فایل txt ذخیره بشند که بعدا بتونید جدا سازی کنید و هر کدوم فیلدها بره توی cell مربوط به خودش .

مثلا

1|نام و نام خانوادگی|سن|جنسیت|تحصیلات

اینجا با کاراکتر | میتونی این فیلدها رو از هم جدا کنید

دقيقا همين كار رو كردم و ركوردها را با fputcsv در انتهاي يك فايل csv ريختم

و در اخر همين فايل را به مشتري ميدم

راحت!