তালিকা <টি> সি # পূরণ করার জন্য SqlDataReader ব্যবহার করে

আমি নীচের মত একটি বর্গ আছে,

class Student
{
    public string Name {get; set;}
    public string Surname {get; set;}
    public int Age {get; set;}
    public string Address {get; set;}
}

এবং আমার 50,000 রেকর্ড সহ একটি MySQL টেবিল আছে। টেবিলের গঠন নিচে মত,

ID        NAME       SURNAME        AGE          ADDRESS
1         Joe        Philip         20           Moscow
2         Misha      Johny          25           London
...

এবং আমি একটি সি # কোড আছে,

List students = new List();
string sql = "SELECT name,surname,age,address FROM Students";
command.CommandText = sql;
MySqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
    Student st = new Student();
    st.Name = reader["Name"].ToString();
    st.Surname = reader["Surname"].ToString();
    st.Age = Convert.ToInt32(reader["Age"].ToString());
    st.Address = reader["Address"].ToString();
    students.Add(st);
}

কিন্তু এটি খুব ধীর কাজ করে। এই কোডটি দ্রুত চালানোর জন্য আপনি কোন পদ্ধতির পরামর্শ দেন?

হালনাগাদ:

যখন আমি এই কোডটি ব্যবহার করি,

DataTable dt = new DataTable();
adapter.Fill(dt);

এটা খুব ভাল কাজ করে এবং গতি খুব স্বাভাবিক। কিন্তু সমস্যাটা কি আমার নিজের ক্লাসের সাথে চেষ্টা করে?

1
আমি এই ডেটা সব এই জন্য ডেটাসেট ব্যবহার memmory মধ্যে অবস্থিত হবে। তাই আমি যদি আমার নিজের ক্লাস ব্যবহার করতে চান তবে পার্থক্য কি?
যোগ লেখক namco, উৎস
আমার উত্তর দেখুন; আপনি যদি এই ছাত্র তথ্য দিয়ে আপনি যা করতে যাচ্ছেন তা আমাদেরকে বললে আপনি আরও ভাল উত্তর পাবেন।
যোগ লেখক Jacob, উৎস
আমাদের বড় বিন্দুটি আপনাকে ডাটাবেসের থেকে সমস্ত রেকর্ডগুলি অপরিহার্যভাবে লোড করার দরকার নেই। আপনি কেবলমাত্র ডেটা উপসেটের প্রয়োজন হলে, আপনি যেখানে বিভাগের সাথে আপনার প্রশ্নটি সীমিত করতে পারেন।
যোগ লেখক Jacob, উৎস
কৌতুহল থেকে, কেন আপনি মেমরি এ সব মেমরিতে সমগ্র ডাটাবেস টেবিলটি পড়তে হবে? ডেটাবেসগুলির সাধারণ ধারণা হল যে তারা মেমরিতে ফিট হতে পারে এমন তুলনায় আরো বেশি ডেটা রাখতে পারে এবং আমাদের রেকর্ডের মাধ্যমে ডেটা রেকর্ড প্রক্রিয়া করতে হবে।
যোগ লেখক Vlad, উৎস
এটি যত তাড়াতাড়ি সম্ভব পেতে পারে, এখানে কোন সুস্পষ্ট বর্ধন বা নজর নেই - আপনার কি এই সমস্ত রেকর্ডের মেমরির দরকার?
যোগ লেখক BrokenGlass, উৎস
যে কোড কম্পাইল না। আপনি int সম্পত্তি (বয়স) এ স্ট্রিং নির্ধারণ করছেন।
যোগ লেখক Klaus Byskov Pedersen, উৎস
অবশ্যই এটা ধীর। একবারে মেমরিতে 50 কে রেকর্ড পড়বেন না!
যোগ লেখক Gabe Moothart, উৎস

2 উত্তর

কোড ধীরে ধীরে চললে, বৃহত্তম কারণ হল 50,000 রেকর্ড। 50,000 শিক্ষার্থী বস্তুর সাথে আপনি ঠিক কি করতে চান? আপনি যদি সমস্ত রেকর্ডগুলি পড়ার এবং সেই সমস্ত বস্তুগুলি তৈরি না করে আপনার সমস্যা সমাধানে কোনও উপায় খুঁজে পেতে পারেন তবে আপনার দ্রুত কোড থাকবে।

এ আপডেট করুন

আপনার নিজের ক্লাস ব্যবহার করে জরিমানা। বেশিরভাগ সময় যখন জিনিসগুলি ধীর হয়ে যায় তখন এটি আপনার কোডটি I/O আবদ্ধ (আপনি আপনার অধিকাংশ সময় I/O এর জন্য অপেক্ষা করে থাকেন)। I/O এর সমস্ত কিছু এড়ানোর জন্য, আপনি যে তথ্যটি পুনরুদ্ধার করেছেন তার পরিমাণ হ্রাস করতে পারেন (সম্ভবত আপনার তথ্য থেকে অপ্রাসঙ্গিক কলাম বা সারিগুলি বাদ দিয়ে) অথবা জটিলতর প্রশ্নের বা স্টোরেজ পদ্ধতির মাধ্যমে আপনার প্রসেসিংয়ে ডাটাবেসটি প্রক্রিয়া করতে পারেন।

আপডেট 2

আপনার ফলোআপ প্রশ্নটির উত্তর দেওয়ার জন্য ( ডেটাসেট পাওয়ার চেয়ে বস্তুর তালিকা তৈরি করা কেন ধীরে ধীরে হয়), আমি আশা করব যে সমগ্র ক্যোয়ারী ডেটাসেট হিসাবে পড়তে হবে বস্তু সৃষ্টি তুলনায় সামান্য দ্রুত। আমি যে MySQL .NET লাইব্রেরি বাস্তবায়িত হয় কিভাবে পরিচিত না। এটা আমার কাছে বিস্ময়কর যে দুটি পদ্ধতিতে বড় গতিতে পার্থক্য থাকবে। হয়তো MySqlDataReader একটি অভ্যন্তরীণ <�কোড> ডেটাসেট ব্যবহার করে কিছু বোকা করছে। যদি পারফরম্যান্সটি দুইয়ের মধ্যে অত্যন্ত ভিন্ন হয়, তবে সম্ভবত এটির লাইব্রেরির লেখক ঠিক করা উচিত।

3 আপডেট করুন

MySQLDataAdapter বা MySQLDataReader এর জন্য সর্বাধিক স্থানান্তর করার জন্য এই উত্তরটির একটি আছে ভালো পরামর্শ; পাঠকের ব্যাচ স্যুইজ সেটিং করা সহায়ক হতে পারে। যদি ব্যাচ আকার পাঠকটির জন্য খুব ছোট হয় তবে এটি আপনার মতো বড় সংখ্যক রেকর্ডগুলির সাথে কম কার্যকরী করে।

5
যোগ
আমি পরীক্ষার পরীক্ষা প্রোগ্রাম লিখুন। আমি এই এবং অন্য তথ্য ব্যবহার করব যা আমি ছাত্রদের পয়েন্ট নির্ধারণের জন্য এখানে দেখিনি। আমি ছাত্র শ্রেণীর পরিবর্তে এখানে ডেটা সেট ব্যবহার করতে পারি। কিন্তু আমি আমার নিজের ক্লাস ব্যবহার করতে পছন্দ করি। RAM এর সাথে কোন সমস্যা নেই। শুধুমাত্র তথ্য সঙ্গে তালিকা ভর্তি সমস্যা। এটা খুব ধীর কাজ করে।
যোগ লেখক namco, উৎস
তথ্যের উপর আপনি কোন ধরণের প্রক্রিয়াকরণ করছেন তা নির্দিষ্ট করে না জানলে আমরা আরও বেশি সহায়তা দিতে পারব না। দ্রুত কোড কোড কম যা, তাই আপনার কোড কম করতে একটি উপায় খুঁজে বের করার চেষ্টা করুন (উদাহরণস্বরূপ ডাটাবেস কিছু প্রক্রিয়াকরণ অফলোড)। আমার আপডেট দেখুন।
যোগ লেখক Jacob, উৎস
সম্পর্কিত প্রশ্নটি দেখুন
যোগ লেখক Jacob, উৎস

Coulmname এর পরিবর্তে রেকর্ডের সূচক ব্যবহার করে কর্মক্ষমতাটি আরও ভাল করে তুলতে পারে ব্যবহার

st.Name = reader[0].ToString();
instead of
st.Name = reader["Name"].ToString();

and 
st.Name = reader[0].ToString();
instead of 
st.Name = reader["surname"].ToString();
1
যোগ
এছাড়াও স্ট্রিং সূচী সঠিক কেস সংবেদনশীলতা হতে হবে তা নোট করুন, অন্যথা এটি খুব ধীর হবে। MySQL ADO.NET বাস্তবায়ন এই ক্ষেত্রে অদ্ভুত। এবং এটি শুধুমাত্র মাইএসকিউএল এডিওর জন্য, আমি পরীক্ষিত প্রত্যেক অন্যান্য সংযোগকারী জরিমানা কাজ করে।
যোগ লেখক nawfal, উৎস