PDA

View Full Version : حرفه ای: پردازش بالای 10 میلیون رکورد و نمایش در برنامه



younes221
سه شنبه 28 بهمن 1393, 15:37 عصر
سلام دوستان امیدوارم که حالتون خوب باشه ، در برنامه ای که نوشتم ، تعداد رکورد های موجود در پایگاه داده می تونه بالای 10 میلیون باشه

در برنامه باید این رکورد ها را پردازش کنم و نتیجه رو به کاربر نشون بدم .

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

پایگاه داده اکسس هست .

بهترین روشی که شما معرفی می کنید چی هست ؟ که بهترین کارایی و سرعت رو داشته باشه .

خیلی ممنون از لطفتون

mrprestige
سه شنبه 28 بهمن 1393, 15:43 عصر
سلام دوست من بهترین روش برای اینجور پروژه های سنگین استفاده از تکنولوژی Entity Framework هست در عین حال بهترین کارایی و سرعت رو داره . من اینو بهت پیشنهاد میدم .

موفق باشید.

محمد آشتیانی
سه شنبه 28 بهمن 1393, 15:46 عصر
سلام
صورت سوالتون خیلی کلی هست ، چه پردازشی باید انجام بشه؟

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






موفق باشید.

younes221
سه شنبه 28 بهمن 1393, 18:09 عصر
خیلی ممنون از لطفتون ،

بزارید یک مثال بزنم تا مسئله روشن تر بشه .

فرض کنید یک بانک داریم با یک جدول به نام tableNumbers که این جدول 2 فیلد داره . یکی کلید اصلی و از نوع AutoNumber و یکی دیگه از نوع عددی .
داخل این جدول شما فرض کنید 3 4 میلیون رکورد وجود داره . به صورت زیر »:

number id
1 936468971
2 1566666699
3 9165984632

به همین صورت تا 4 میلیون .

حالا شما فرض کنید داخل برنامه می خوام رکورد هایی که باقیمانده تقسیم فیلد number اونها بر 2 برابر 0 باشه رو در datagridview نشون بدم .

امیدوارم که منظورم رو خوب رسونده باشم . منظور از پردازش همچین چیزی هست و پردازش های سنگین رو انجام نمیدم . با چند نخی هم مشکلی ندارم و بهش مسلط هستم . راه حلی که به ذهنم میرسه اینه که با استفاده از یک Thread مقدار مثلا 3000 رکورد رو از پایگاه داده بخونم و با استفاده از نخی دیگه روی تک تک رکورد ها عمل مقایسه رو انجام بدم . سپس دوباره 3000 رکورد دیگه بخونم و به همین ترتیب. دوباره تاکید می کنم پردازشی که قصد دارم روی فیلد number انجام بدم به هیچ وجه نمیشه با SQL انجام داد . باید حتما از طریق C#‎ باشه

چون سرعت برنامم باید زیاد باشه و هنگ نکنه و این تعداد رکورد رو باید حتما پشتیبانی کنه . میخوام بهترین الگوریتم رو براش پیدا کنم.

همچنین اگه میشه در رابطه با نمایش این حجم رکورد در DataGridView هم راهنماییم کنید . نظر خودم اینه که مثلا 2000 رکورد رو Load کنم و وقتی کاربر Scroll رو به پایین ترین حد میاره 1000 رکورد دیگه هم Load بشه و به همین صورت .

خیلی ممنون

ali_md110
چهارشنبه 29 بهمن 1393, 14:24 عصر
میتونید یک فیلدflag دیگه داشته باشید و هنگام درج رکورد فیلد number عمل تقسیم بر2 بکنید و اگر باقیمانده صفر بود این فیلد flag رو true یا false کنید
دیگه وقت بازیابی نیاز به عمل تقسیم نداشته باشید

اگر از عمل paging به همراه BackgroundWorker استفاده کنید سرعت بالاتری دارید
Ling to Entity برای paging دستورات مناسبی داره

younes221
چهارشنبه 29 بهمن 1393, 15:03 عصر
خیلی ممنون از لطف شما دوست عزیز ،

در پست قبلیم گفتم پردازشی که قصد دارم روی رکورد ها انجام بدم نمیشه با دستور SQL انجام داد و باید حتما رکورد رو بازیابی کنم و اون پردازش رو روش انجام بدم .

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

به نظرتون راه حلی خوبی هست یا اینکه پیشنهاد بهتری دارید .

ali_md110
چهارشنبه 29 بهمن 1393, 15:27 عصر
استفاده از Thread خوبه ولی ترد اصلی برنامتون رو به تردهای متعدد نشکنید روش مناسبی نیست
شما چه حساب کتابی میخواید توی کد برنامه انجام بدید؟ که توی اسکیول نمیشه؟ میتونید از CLR اسکیول هم استفاده کنید

younes221
پنج شنبه 30 بهمن 1393, 11:41 صبح
خیلی ممنون از لطف شما ، بانک اطلاعاتی برنامه Access هست ،

با توجه به بررسیهایی که کردم . به این نتیجه رسیده که بهتره با استفاده از VBA چندین تابع رو که عمل مختلف روی رکورد ها رو انجام میدن رو بنویسیم و داخل بانک پردازش رو انجام بدم .

سرعتش خیلی بهتر شد نسبت به واکشی و پردازش در سی شارپ .

خیلی ممنون از دوستان

golbafan
پنج شنبه 30 بهمن 1393, 11:54 صبح
در پست قبلیم گفتم پردازشی که قصد دارم روی رکورد ها انجام بدم نمیشه با دستور SQL انجام داد و باید حتما رکورد رو بازیابی کنم و اون پردازش رو روش انجام بدم .


سلام
انجام عمل mod در دستورات sql هست ، چطور نمیشه انجام داد؟
در ضمن اگر فیلد مورد نظر ایندکس بشه سرعت بهتر میشه

من با mysql تست زدم برای 4 میلیون رکورد حدود 0.8 ثانیه شد (غیر از نمایش)