在 C# 中读取包含大量行的文本文件
本文关键字:文本 文件 包含大 读取 | 更新日期: 2023-09-27 18:35:44
我有一个文本文件,其中可能有多达 100 万行,我有一个一次读取一行文件的代码,但这需要很多时间......很多很多时间。c# 中是否有一种方法可以潜在地优化此过程并改进读取。这是我正在使用的代码。
using(var file = new StreamReader(filePath))
{
while((line = file.ReadLine()) != null)
{
//do something.
}
}
关于批量阅读这些行或改进流程的任何建议?
谢谢。
感谢您的所有评论。该问题与我使用 SmartXls 库写入 Excel 的 ''do 某些事情有关,这导致了瓶颈。我已经联系了开发人员来解决这个问题。所有建议的解决方案都适用于其他方案。
好吧,这段代码会更简单,如果你使用的是 .NET 4 或更高版本,你可以使用 File.ReadLines
:
foreach (var line in File.ReadLines())
{
// Do something
}
请注意,这与 ReadAllLines
不同,因为ReadLines
返回一个懒惰读取行的IEnumerable<string>
,而不是一次性读取整个文件。
执行时的效果将与原始代码大致相同(它不会提高性能) - 这只是更容易阅读。
从根本上说,如果您正在读取一个大文件,则可能需要很长时间 - 但仅读取一百万行不应该花费"很多很多时间"。我的猜测是,无论你用线条做什么,都需要很长时间。您可能希望并行化它,可能使用生产者/消费者队列(例如通过BlockingCollection
)或TPL数据流,或者只使用并行LINQ,Parallel.ForEach
等。
您应该使用探查器来确定时间花费在哪里。如果您正在从非常慢的文件系统读取,那么可能真的是读取需要时间。我们没有足够的信息来指导您,但您应该能够自己缩小范围。
尝试使用流阅读器,看看它是否更快
string filePath = "";
string fileData = "";
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
byte[] data = new byte[fs.Length];
fs.Seek(0, SeekOrigin.Begin);
fs.Read(data, 0, int.Parse(fs.Length.ToString()));
fileData = System.Text.Encoding.Unicode.GetString(data);
}
StreamReader的int ReadBlock(char[] buffer, int index, int count)
一次读取更多数据,而不是逐行读取。 这避免了一次读取整个文件(File.ReadAllLines
),但允许您一次处理RAM中的较大块。
若要提高性能,请考虑通过生成另一个线程来处理负载来执行当前在循环中执行的任何工作。
Parallel.ForEach(file.ReadLines(), (line) =>
{
// do your business
});
如果空间不是问题..创建一个大约 1mb 的缓冲区。
using(BufferedStream bs=new BufferedStream(File.OpenRead(path),1024*1024))
{
int read=-1;
byte[] buffer=new byte[1024*1024];
while((read=bs.Read(buffer,0,buffer.Length))!=0)
{
//play with buffer
}
}
您还可以使用 ReadAllLines(filepath)
并将文件加载到行数组中,如下所示: string[] lines = System.IO.File.ReadAllLines(@"path");