gpt4 book ai didi

c# - StreamReader 在同时读取非常大的文件时性能不佳

转载 作者:行者123 更新时间:2023-11-30 19:40:12 28 4
gpt4 key购买 nike

我需要在 C# 应用程序上同时逐行读取四个非常大 (>2 Gb) 的文件。我使用了四种不同的 StreamReader 对象及其 ReadLine() 方法。 同时从四个文件中读取行时,性能会受到严重影响,但随着每个文件都达到 EoF(perf with 4 files < perf with 3 files < perf with 2文件...)。

我有这个(简化的,假设只有两个文件以获得更清晰的示例)代码:

StreamReader readerOne = new StreamReader(@"C:\temp\file1.txt");
StreamReader readerTwo = new StreamReader(@"C:\temp\file2.txt");

while(readerOne.Peek() >= 0 || readerTwo.Peek() >= 0)
{
string[] readerOneFields = readerOne.Peek() >= 0 ?
readerOne.ReadLine().Split(',') : null;
string[] readerTwoFields = readerTwo.Peek() >= 0 ?
readerTwo.ReadLine().Split(',') : null;

if (readerOneFields != null && readerTwoFields != null)
{
if (readerOneFields[2] == readerTwoFields[2])
{
// Do some boring things...
}
else if (readerOneFields != null)
{
// ...
}
else
{
// ...
}
}
readerOne.Close();
readerTwo.Close();

我必须同时读取这些文件的原因是因为我需要比较这些行,然后将结果写入一个新文件。

我已经阅读了很多关于使用 StreamReader 读取大文件的问题,但我找不到像我这样的场景。它是使用 ReadLine() 方法来完成它的正确方法吗?它甚至是 StreamReader 合适的类吗?

更新:现在事情变得更奇怪了。只是为了测试,我试图通过删除行将文件大小减少到大约 10 Mb,只留下 70K 条记录。此外,我曾尝试同时只使用两个文件(而不是四个)。我在同时读取两个文件时同样表现不佳!当其中之一达到 EoF 时,性能会变得更好。我将 StreamReader 缓冲区大小设置为 50 MB。

最佳答案

到目前为止,您对磁盘所做的最昂贵的事情就是迫使读头从一个磁道移动到另一个磁道。它是一种机械运动,典型的成本约为每条轨道 13 毫秒。

您正在移动读者的头部,不断地从一个文件到另一个文件来回移动。需要缓冲来降低成本,换句话说,一口气从一个文件中读取大量数据。操作系统已经做了一些缓冲,它从文件中读取了一段数据。你需要更多。

使用 StreamReader constructors 之一允许您指定缓冲区大小。对于这么大的文件,50 兆字节的缓冲区大小是合适的。

关于c# - StreamReader 在同时读取非常大的文件时性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24568307/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com