从文件中读取的速度不够快,我该如何加快速度
本文关键字:速度 何加快 不够 文件 读取 | 更新日期: 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.Length
是long
,所以需要强制转换。)
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 "";
}
}
希望这对你有帮助。有关更多信息,请访问以下链接-读取文本文件的最快方法