PDA

View Full Version : حرفه ای: چگونه سرعت خواندن فایل را بالا ببریم



h_jafarnezhad
یک شنبه 29 شهریور 1394, 09:40 صبح
سلام یه برنامه دارم که چند تا فایل اکسس رو میخونه تعداد رکوردای هر کدوم هم خیلی بالاس چه طوری میتونم سرعت خوندن از فایل رو بالا ببرم

aliasghar2
یک شنبه 29 شهریور 1394, 09:44 صبح
سلام میتونی از مولتی ترد استفاده کنی

h_jafarnezhad
یک شنبه 29 شهریور 1394, 09:48 صبح
چه طوری تا حالا این طوری برنامه ننوشتم
الان سرعت برنامه خیلی پایینه تازه هنوز یه بانک رو زدم ک باز کنه

h_jafarnezhad
یک شنبه 29 شهریور 1394, 09:48 صبح
قبل از ظهر برنامه باید اماده باشه

plus
یک شنبه 29 شهریور 1394, 09:56 صبح
سرعت خوانده شدن داده ها از فایل از دسترس شما خارج هست و به محل نگه داری فایل (هارد دیست، فلش و...) بستگی داره. شما میتونی تعداد رکوردهایی که قراره خونده بشه رو کم کنی، تعداد فیلدها رو کم کنی، اگه کوئری بهینه نیست بهینه ش کنید و کارهایی ازین دست.

aliasghar2
یک شنبه 29 شهریور 1394, 09:56 صبح
میشه کدت رو بزاری تا بگم کجاهاشو به صورت ترد بنویسی

drsina
یک شنبه 29 شهریور 1394, 09:56 صبح
ربطی به مالتی ترد نداره ( مالتی ترد سرعت بالا نمیبره شما فقط می تونید چندتا کار را باهم باهمون سرعت قبلی انجام بدید . ) خود اکسس سرعتش پایینه . پیشنهاد می کنم از sql استفاده کنید .

h_jafarnezhad
یک شنبه 29 شهریور 1394, 09:58 صبح
ان کد کل برنامس
namespace CompareDatabase
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openfile = new OpenFileDialog();
if (openfile.ShowDialog() == DialogResult.OK)
{
if (openfile.FileName.Contains(".ACCDB") || openfile.FileName.Contains(".accdb"))
{
OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder();
Builder.Provider = "Microsoft.ACE.OLEDB.12.0";
Builder.DataSource = Path.Combine(openfile.FileName.Replace("/", "//"));
Class1.con.ConnectionString = Builder.ToString();
}
if (openfile.FileName.Contains(".MDB") || (openfile.FileName.Contains(".mdb")))
{
OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder();
Builder.Provider = "Microsoft.JET.OLEDB.4.0";
Builder.DataSource = Path.Combine(openfile.FileName.Replace("/", "//"));
Class1.con.ConnectionString = Builder.ToString();
}
///////////////////////////////////////////////////////////////////////////
Class1.con.Open();
OleDbCommand com = new OleDbCommand();
com.Connection = Class1.con;
com.CommandText = "select * from [mobile_list]";
OleDbDataReader reader;
reader = com.ExecuteReader();
string x = "";
while (reader.Read())
{
x += reader.GetValue(0) + "\n";
richTextBox1.Text = x;
}
richTextBox1.Text = x;
Class1.con.Close();
}
}

aliasghar2
یک شنبه 29 شهریور 1394, 09:59 صبح
ربطی به مالتی ترد نداره ( مالتی ترد سرعت بالا نمیبره شما فقط می تونید چندتا کار را باهم باهمون سرعت قبلی انجام بدید . ) خود اکسس سرعتش پایینه . پیشنهاد می کنم از sql استفاده کنید .
میدونم سرعت اکسس پایینه ولی وقتی چنتا فایل رو قراره بخونه بهتره هر فایل رو به ترد بسپره تا دیگه فایل ها تو صف نمونن و سرعت بهتر بشه ولی تو حالت عادی باید منتظر بمونن فایل اول خونده بشه بعد بره سراغ فایل دوم

h_jafarnezhad
یک شنبه 29 شهریور 1394, 09:59 صبح
ممنون میشم کمکم کنین زمان زیادی ندارم

h_jafarnezhad
یک شنبه 29 شهریور 1394, 10:02 صبح
الان فایل ها رو یکی یکی باز میکنم اولی که لود شود کامل کار بر باید فایل بعدی رو باز کنه خیلی زمان میبره تعداد رکورد ها خیلی بالاس

aliasghar2
یک شنبه 29 شهریور 1394, 10:07 صبح
این کدی که گذاشتی رو خوندم چیزی که ازش فهمیدم سه تا دکمه داری که هرکدوم رو که بزنی یه فایل میگیره و اطلاعاتش رو درون یه Richtextbox میریزه
اینجوری نمیتونی ار ترد استفاده کنی چون ترد نمیتونه به کنترل دسترسی پیدا کنه باید از BackGround worker استفاده کنی یا اینکه ا.ل سه تا فایل رو بگیری بعد با Parallel.ForEach به ازای لیست فایل هات تابع خوندن فایل رو فراخوانی کنی و نتیجه رو بریزی توی یه متغییر عمومی و در اخر بیای بریزی تویه کنترلت البته این مورد یکم طولانی به نظر میرسه ولی از نظر زمانی بهینس

h_jafarnezhad
یک شنبه 29 شهریور 1394, 10:13 صبح
اگه بانک رو ببرم به اسکیول سرعت بالاتر میره یا نه
الان ک هنوز یه دونه فایل رو ک گذاشتم بخونه تموم نشده

h_jafarnezhad
یک شنبه 29 شهریور 1394, 10:14 صبح
همون طور ک میبینی فایل رو ک بخونه تازه کار اصلی شروع میشه