القراءة من الملف ليس سريع بما فيه الكفاية كيف السرعة ؟
-
03-07-2019 - |
سؤال
هذه هي الطريقة التي قرأت الملف:
public static string readFile(string path)
{
StringBuilder stringFromFile = new StringBuilder();
StreamReader SR;
string S;
SR = File.OpenText(path);
S = SR.ReadLine();
while (S != null)
{
stringFromFile.Append(SR.ReadLine());
}
SR.Close();
return stringFromFile.ToString();
}
المشكلة هي طويلة جدا (على .ملف txt حوالي 2.5 ميغس).استغرق أكثر من 5 دقائق.هل هناك طريقة أفضل ؟
الحل المتخذة
public static string readFile(string path)
{
return File.ReadAllText(path);
}
استغرق أقل من 1 في الثانية...:)
المحلول
وإذا نحينا جانبا الرهيبة أسماء المتغيرات وعدم استخدام البيان (لن يغلق ملف إذا كان هناك أي استثناءات) ينبغي أن يكون حسنا ، بالتأكيد لن يستغرق 5 دقائق لقراءة 2.5 ميغس.
أين الملف تعيش ؟ هو على قشاري شبكة حصة ؟
بالمناسبة, الفرق الوحيد بين ما تفعله باستخدام ملف.ReadAllText هو أنك تفقد فواصل الأسطر.هل هذا متعمد ؟ كم ReadAllText ؟
نصائح أخرى
S = SR.ReadLine();
while (S != null)
{
stringFromFile.Append(SR.ReadLine());
}
من ملاحظة هنا ، S
هو لم يقع بعد ذلك الأولية ReadLine()
, لذا S != null
حالة لم يطلق إذا قمت بإدخال أثناء الحلقة.محاولة:
S = SR.ReadLine();
while (S != null)
{
stringFromFile.Append(S = SR.ReadLine());
}
أو استخدام واحدة من التعليقات الأخرى.
إذا كنت تحتاج إلى إزالة أسطر استخدام سلسلة.محل(البيئة.السطر, "")
return System.IO.File.ReadAllText(path);
ماركوس Griep له ذلك الحق.انها تأخذ وقتا طويلا لأن لديك حلقة لا نهائية.نسخ التعليمات البرمجية الخاصة بك وجعل له التغييرات و قراءة 2.4 M نص الملف في أقل من ثانية.
ولكن أعتقد أنك قد يغيب السطر الأول من الملف.جرب هذا.
S = SR.ReadLine();
while (S != null){
stringFromFile.Append(S);
S = SR.ReadLine();
}
هل تحتاج إلى كامل 2.5 ميغابايت في الذاكرة في وقت واحد ؟
إذا لم يكن في محاولة للعمل مع ما تحتاجه.
استخدام النظام.IO.الملف.RealAllLines بدلا من ذلك.
http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx
بدلا من ذلك, تقدير عدد الأحرف ويمر ذلك بـ stringbuilder منشئ كما أن سرعة الأمر.
جرب هذا, يجب أن يكون أسرع من ذلك بكثير:
var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");
بالمناسبة:في المرة القادمة كنت في وضع مماثل ، حاول قبل تخصيص الذاكرة.هذا يحسن وقت التشغيل بشكل كبير ، بغض النظر الدقيق هياكل البيانات التي تستخدمها.معظم الحاويات (StringBuilder
وكذلك) منشئ يسمح لك لحجز الذاكرة.هذه الطريقة أقل استهلاكا للوقت إعادة تخصيص ضرورية أثناء عملية القراءة.
على سبيل المثال ، يمكنك كتابة التالي إذا كنت ترغب في قراءة البيانات من ملف في StringBuilder
:
var info = new FileInfo(path);
var sb = new StringBuilder((int)info.Length);
(يلقي ضروري لأن System.IO.FileInfo.Length
هو long
.)
ReadAllText كان حل جيد جدا بالنسبة لي.اعتدت البرمجية التالية 3.000.000 الصف ملف نصي واستغرق 4-5 ثواني لقراءة جميع الصفوف.
string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split('\n');
حلقة ، StringBuilder
قد تكون زائدة عن الحاجة ؛ حاول استخدام
ReadToEnd.
لقراءة ملف نصي أسرع يمكنك استخدام شيء مثل هذا
public static string ReadFileAndFetchStringInSingleLine(string file)
{
StringBuilder sb;
try
{
sb = new StringBuilder();
using (FileStream fs = File.Open(file, FileMode.Open))
{
using (BufferedStream bs = new BufferedStream(fs))
{
using (StreamReader sr = new StreamReader(bs))
{
string str;
while ((str = sr.ReadLine()) != null)
{
sb.Append(str);
}
}
}
}
return sb.ToString();
}
catch (Exception ex)
{
return "";
}
}
نأمل أن يكون هذا سوف تساعدك.و لمزيد من المعلومات ، يرجى زيارة الرابط التالي أسرع طريقة قراءة الملفات النصية