PDA

View Full Version : برای انجام 3ملیون عملیات همزمان باید چیکار کرد



ghasembaghi
چهارشنبه 20 آبان 1388, 20:19 عصر
من یه اسکریپت نوشتم که یک سری اطلاعات را از یکجا میخونه و میریزه داخل دیتابیس.
حجم اطلاعاتی که قراره توی دیتابیس ریخته بشه حدود 80گیگابایته که حدود 3 تا 4ملیون رکورد میشه.
درواقع یک عملیات درج در دیتابیس هست که چند ملیون بار انجام میشه.
پیش بینی من اینه که حداقل 24ساعت اینکار طول بکشه.

یک راه اینه که با یه دستور حلقه for با تکرار مثلا 3ملیون بار من این کار را انجام بدم ولی خب فکرکنم این کار، کار عاقلانه ای نیست.

از دوستان هر کس هر پیشنهادی برای نحوه انجام کار داره بگه

امیـرحسین
چهارشنبه 20 آبان 1388, 22:16 عصر
اول اینکه باید مطمئن شید سرور اجازه اجرای چنین حجمی میشه.
دوم اینکه باید مطمئن شید سرور توانایی اجرایی چنین حجمی رو داره یا نه.
سوم اینکه دستورات SQL رو معمولا میشه بهینه کرد تا ارتباط با دیتابیس کمتر شه. مثلا همه دستورهای INSERT رو میشه با یه کوئری فرستاد.
سوم اینکه شاید اگر تیکه تیکه انجام ندید بهتر باشه. مثلا دستورات رو به چند قسمت تقسیم کنید.
و آخر اینکه، به خودتون مربوطه ولی سایتی با چنین حجم دیتابیس به نظر کند میاد!

ghasembaghi
پنج شنبه 21 آبان 1388, 06:55 صبح
اول اینکه باید مطمئن شید سرور اجازه اجرای چنین حجمی میشه.
دوم اینکه باید مطمئن شید سرور توانایی اجرایی چنین حجمی رو داره یا نه.

از نظر سرور مشکلی وجود نداره (شما فکر کن روی سرور اختصاصی یا لوکال انجام میشه)


سوم اینکه دستورات SQL رو معمولا میشه بهینه کرد تا ارتباط با دیتابیس کمتر شه. مثلا همه دستورهای INSERT رو میشه با یه کوئری فرستاد.

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


سوم اینکه شاید اگر تیکه تیکه انجام ندید بهتر باشه. مثلا دستورات رو به چند قسمت تقسیم کنید.
یعنی منظورتون اینه که مثلا 10هزارتا را انجام بدم با یه اسکریپت و وقتی تموم شد 10هزارتای بعدی را بزارم.(با کم و زیاد کردن شمارنده حلقه) و اینکار را 300بار تکرار کنم؟!

میخوام ببینم راهی وجود نداره که مثلا یه حلقه تو در تو بنویسم که حلقه اول از 1 تا 300 شمارش کنه و به ازای هر بار شمارش حلقه دوم اجرا بشه که توی حلقه دوم 10هزارتا عملیات انجام بشه فقط بین هر بار شمارش حلقه اول یه زمانی صبر کنه تا عملیات حلقه دوم انجام بشه و بعد از یه زمان خاص(استراحت)، شمارش بعدی را انجام بده.



و آخر اینکه، به خودتون مربوطه ولی سایتی با چنین حجم دیتابیس به نظر کند میاد!
پیشهناد شما چیه؟ از چه دیتابیسی باید استفاده کرد. ببینید این تعداد عملیات که میگم برای ایجاد دیتابیسه. از این به بعد فقط نمایش و جستجوی اطلاعات وجود داره.

zoghal
پنج شنبه 21 آبان 1388, 09:24 صبح
اگر اطلاعات در یک دیتابیس قرار داره و قرار در دیتابی دیگر درج بشه. با دستور

select into
کارتون راه میوفته.

ghasembaghi
پنج شنبه 21 آبان 1388, 18:03 عصر
خیر
اطلاعات از یک سری فایل متنی خونده میشن و بعد از یکسری پردازش به دیتابیس اضافه میشه

شما اگر اسکریپت رپیدلیچ را دیده باشید نمونه خوبی برای کار من هست منتها من از عملکردش سر در نیاوردم
این اسکریپت به این صورت عمل میکنه که یه فایل حجیم را از رپیدشیر کپی میکنه روی سرور دیگه
منظور من به نحوه کپی کردنش نیست منظورم اینه که موقع کپی کردن مثلا یه فایل 100مگابایتی که ممکنه بین 10 تا 20 دقیقه طول بکشه اسکریپت تایم آوت نمیده و مراحل پیشرفت کار را توی یک پروگرس بار (یک تا 100 درصد نشون میده)

reza_22
جمعه 29 آبان 1388, 21:46 عصر
میخوام ببینم راهی وجود نداره که مثلا یه حلقه تو در تو بنویسم که حلقه اول از 1 تا 300 شمارش کنه و به ازای هر بار شمارش حلقه دوم اجرا بشه که توی حلقه دوم 10هزارتا عملیات انجام بشه فقط بین هر بار شمارش حلقه اول یه زمانی صبر کنه تا عملیات حلقه دوم انجام بشه و بعد از یه زمان خاص(استراحت)، شمارش بعدی را انجام بده.


سلام

شما می تونید برای ایجاد وقفه در هنگام اجرای برنامه از تابع sleep() استفاده کنید.

همچنین برای افزایش مدت زمان اجرای برنامه هم بایستی در فایل php.ini مقدار max_execution_time را بر حسب ثانیه تنظیم کنید.