القراءة من الملف ليس سريع بما فيه الكفاية كيف السرعة ؟

StackOverflow https://stackoverflow.com/questions/212089

سؤال

هذه هي الطريقة التي قرأت الملف:

    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 "";
        }
    }

نأمل أن يكون هذا سوف تساعدك.و لمزيد من المعلومات ، يرجى زيارة الرابط التالي أسرع طريقة قراءة الملفات النصية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top