如何有效地阅读冗长的文本文件?

时间:2011-03-29 23:56:32

标签: c# optimization file-read

如果你有一个包含很多条目的大文本文件,你必须得到它们并将它们保存到List,如果有更快的方法,而不是像我的代码中的传统方式那么

    /// <summary>
    /// Reads Data from the given path
    /// </summary>
    /// <param name="path">Path of the File to read</param>
    public void Read(string path)
    {
        try
        {
            FileStream file = new FileStream(path, FileMode.Open);
            StreamReader reader = new StreamReader(file);
            string line;

            while ((line = reader.ReadLine()) != null)
            {                
                myList.Add(line);
                System.Windows.Forms.Application.DoEvents();
            }
            reader.Close();
            file.Close();
        }
        catch (Exception c)
        {
            MessageBox.Show(c.Message);
        }

    }

3 个答案:

答案 0 :(得分:6)

更快 - 可能不是,但更短?是:

myList.AddRange(File.ReadAllLines(path));

此外,如果这是一个非常大的文件,你不应该在UI线程中进行加载,只需使用后台工作程序 - 这样可以避免在每一行上调用Application.DoEvents()并且可能会在某种程度上比原始方法更快 - 虽然与文件I / O的成本相比节省的成本很少,但您将获得更清晰的代码。

答案 1 :(得分:4)

通常情况下,我会将此作为评论,但在这种情况下,它实际上是一个答案。

不,没有。你阅读文件的速度要比阅读它快得多!

读取文件是线性时间,请放下。

现在,如果你知道有关该文件的一些信息,比如说...你想跳过一些标题信息,你可以通过跳过来做。但是如果文件中的位置依赖于先前的数据(不是固定的宽度),或者你需要它中的每一行,那么它不会比这更快。

答案 2 :(得分:1)

你将不得不摆脱DoEvents()。试试吧:在忙着阅读文件时关闭表格。请注意,您的程序不会停止。当读数完成时,它很可能会崩溃并死亡。

这也应该加快文件的读取速度。要防止UI冻结,您应该使用BackgroundWorker。请务必阅读MSDN Library文章,以便他们做到这一点。

让它更快仍然需要硬件。首先询问为什么你必须阅读这么大的文本文件,该文件中的信息可能属于数据库。