为了找到逐行读取文件的最快方法,您必须进行一些基准测试。我已经在计算机上进行了一些小测试,但是您不能期望我的结果适用于您的环境。
使用StreamReader.ReadLine
这基本上是您的方法。由于某种原因,您将缓冲区大小设置为最小的可能值(128)。增加此值通常会提高性能。默认大小是1,024,其他好的选择是512(Windows中的扇区大小)或4,096(NTFS中的群集大小)。您将必须运行基准以确定最佳缓冲区大小。较大的缓冲区(如果不是更快的话)至少不比较小的缓冲区慢。
const Int32 BufferSize = 128;
using (var fileStream = File.OpenRead(fileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
String line;
while ((line = streamReader.ReadLine()) != null)
// Process line
}
该FileStream
构造函数允许你指定FileOptions。例如,如果您从头到尾依次读取一个大文件,则可能会受益FileOptions.SequentialScan
。同样,基准测试是您可以做的最好的事情。
使用File.ReadLines
这非常类似于您自己的解决方案,除了使用StreamReader
固定缓冲区大小为1,024的A来实现。在我的计算机上,与缓冲区大小为128的代码相比,这会导致性能稍好。但是,使用较大的缓冲区大小可以获得相同的性能提升。此方法使用迭代器块实现,并且不会消耗所有行的内存。
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
使用File.ReadAllLines
这与以前的方法非常相似,不同之处在于此方法会增长用于创建返回的行数组的字符串列表,因此内存需求更高。但是,它返回String[]
并且IEnumerable<String>
不允许您随机访问这些行。
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
使用String.Split
这种方法至少在大文件上(在511 KB文件上测试)至少要慢得多,这可能是由于其String.Split
实现方式。与解决方案相比,它还为所有行分配一个数组,从而增加了所需的内存。
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
我的建议是使用,File.ReadLines
因为它干净高效。如果需要特殊的共享选项(例如使用FileShare.ReadWrite
),则可以使用自己的代码,但应增加缓冲区的大小。
Fastest
您从性能还是发展前景呢?