从文件中读取的速度不够快,我该如何加快速度

本文关键字:速度 何加快 不够 文件 读取 | 更新日期: 2023-09-27 17:47:48

这是我读取文件的方式:

    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秒…:)

从文件中读取的速度不够快,我该如何加快速度

S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(SR.ReadLine());
}

这里需要注意的是,S永远不会设置在初始ReadLine()之后,因此如果您进入while循环,S != null条件永远不会触发。尝试:

S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(S = SR.ReadLine());
}

或者使用其他评论中的一个。

如果需要删除换行符,请使用字符串。替换(Environment.NewLine,")

抛开糟糕的变量名和缺少using语句(如果有任何异常,您不会关闭文件)不谈,当然读取2.5兆应该不需要5分钟。

文件位于何处?它是在一个不稳定的网络共享上吗?

顺便说一句,你所做的和使用File.ReadAllText之间的唯一区别是你失去了换行符。这是故意的吗?ReadAllText需要多长时间?

return System.IO.File.ReadAllText(path);

Marcus Griep说得对。它花了这么长时间,因为你有一个无限的循环。复制了你的代码并进行了更改,它在不到一秒钟的时间内读取了一个2.4M的文本文件。

但我想你可能会漏掉文件的第一行。试试这个。


S = SR.ReadLine();
while (S != null){
    stringFromFile.Append(S);
    S = SR.ReadLine();
}

Do you need the entire 2.5 Mb in memory at once?

If not, I would try to work with what you need.

Use System.IO.File.RealAllLines instead.

http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx

Alternatively, estimating the character count and passing that to StringBuilder's constructor as the capacity should speed it up.

Try this, should be much faster:

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.Lengthlong,所以需要强制转换。)

ReadAllText对我来说是一个非常好的解决方案。我对3.000.000行文本文件使用了以下代码,读取所有行需要4-5秒。

string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split(''n');

循环和StringBuilder可能是冗余的;尝试使用读取结束。

要以最快的速度读取文本文件,可以使用类似的东西

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

希望这对你有帮助。有关更多信息,请访问以下链接-读取文本文件的最快方法