gpt4 book ai didi

c# - 如何使用 C# 计算一个字符在一个大(5+ GB)文件中的出现次数?

转载 作者:行者123 更新时间:2023-11-30 21:43:05 25 4
gpt4 key购买 nike

为了提供一些上下文,我正在尝试优化以下代码它逐行读取文件,缓冲这些行并每 100 行保存到数据库中 -

using (StreamReader sr = new StreamReader(fileName, Encoding.Default)) 
{
IList<string> list = new List<string>();
int lineCount = 0;
foreach (var line in sr.ReadLines((char)someEOL)) //ReadLines is an extension method that yield returns lines based on someEOL while reading character by character
{
list.Add(line); //Keeping it simple for this example. In the actual code it goes through a bunch of operations
if(++lineCount % 100 == 0) { //Will not work if the total number of lines is not a multiple of 100
SaveToDB(list);
list = new List<string>();
}
}
if(list.Count() > 0)
SaveToDB(list); //I would like to get rid of this. This is for the case when total number of lines is not a multiple of 100.
}

您会注意到,SaveToDB(list) 在上面的代码中出现了两次。如果 total number of lines % 100 != 0 (例如,如果有 101 行,则 if(lineCount % 100 == 0) 第二次需要它> 会错过最后一个)。这不是一个大麻烦,但我想知道我是否可以摆脱它。

为此,如果我可以在进入 foreach 循环之前读取总行数,我可以用不同的方式编写 if(lineCount % 100 == 0)。但是要找到总行数需要逐个字符地遍历文件以计算 someEOL 这绝对不是,因为文件大小范围为 5-20 GB。有没有一种方法可以在不影响性能的情况下进行计数(这对我来说似乎很可疑,但也许有解决方案)?或者用另一种方法重写它以摆脱额外的 SaveDB(list) 调用?

最佳答案

除了每次读取 100 行时都会创建新的空列表外,您的代码看起来不错。无论如何,您可能想尝试这种方法:

var enumerator = sr.ReadLines((char)someEOL).GetEnumerator();
isValid = true;

for (int i = 1; isValid; i++)
{
bool isValid = enumerator.MoveNext();

if (isValid)
{
list.Add(enumerator.Current);
}

if (i % 100 == 0 || (!isValid && list.Count() > 0))
{
SaveToDB(list);

// It is better to clear the list than creating new one for each iteration, given that your file is big.
list.Clear();
}
}

关于c# - 如何使用 C# 计算一个字符在一个大(5+ GB)文件中的出现次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42047246/

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