我正在开发一个C#程序,用于读取非常大的文件并检查它们的不同属性和字段。我之前一直在使用不到100万行的文件进行测试,并且表现符合预期。但最近我对一个有250万行的文件进行了测试,需要花费4个小时才能运行完毕。
我使用自定义的读取函数逐个字符读取文件,以便找到所有CR和LF,因为每行都包含它们非常重要。我已经单独测试过读取函数,它花费了大约14分钟来读取整个文件,我认为这足够合理,可以读取1500个字符的250万行。我会把我的读取函数放在下面,但似乎这不是问题的原因。
我的读取函数将每个字符添加到一个字符串中,然后我检查字符串中的不同值。例如,行长度是否正确,文件是否包含标题以及标题是否包含正确的值。还有特定的值,如字符位置403-404是否为数字,字段1250-1300是否不为空等。
我的问题是,我该怎么做才能找出导致程序运行缓慢的原因并提高程序的效率?我尝试在每个行循环的开头和结尾检查时间,但似乎没有改变。但是,每10万行处理的时间都比前面的时间长得多。例如,处理第10,000到20,000行只需要不到3秒,而处理第830,000到840,000行需要约35秒。我考虑尝试使用多个线程,但认为在我从文件中读取行的情况下不会有帮助。你有什么想法吗?谢谢帮忙!
我使用自定义的读取函数逐个字符读取文件,以便找到所有CR和LF,因为每行都包含它们非常重要。我已经单独测试过读取函数,它花费了大约14分钟来读取整个文件,我认为这足够合理,可以读取1500个字符的250万行。我会把我的读取函数放在下面,但似乎这不是问题的原因。
我的读取函数将每个字符添加到一个字符串中,然后我检查字符串中的不同值。例如,行长度是否正确,文件是否包含标题以及标题是否包含正确的值。还有特定的值,如字符位置403-404是否为数字,字段1250-1300是否不为空等。
我的问题是,我该怎么做才能找出导致程序运行缓慢的原因并提高程序的效率?我尝试在每个行循环的开头和结尾检查时间,但似乎没有改变。但是,每10万行处理的时间都比前面的时间长得多。例如,处理第10,000到20,000行只需要不到3秒,而处理第830,000到840,000行需要约35秒。我考虑尝试使用多个线程,但认为在我从文件中读取行的情况下不会有帮助。你有什么想法吗?谢谢帮忙!
static void ReadMyLine(ref string currentLine, string filePath, ref int asciiValue, ref Boolean isMissingCR, ref Boolean isMissingLF, ref Boolean isReversed, ref StreamReader file)
{
Boolean endOfRow = false;
isMissingCR = false;
isMissingLF = false;
isReversed = false;
currentLine = "";
while (endOfRow == false)
{
asciiValue = file.Read();
if (asciiValue == 10 || asciiValue == 13)
{
int asciiValueTemp = file.Peek();
if (asciiValue == 13 && asciiValueTemp == 10)
{
endOfRow = true;
asciiValue = file.Read();
}
else if (asciiValue == 10 && asciiValueTemp == 13) // CRLF Reversed
{
asciiValue = file.Read();
endOfRow = true;
isReversed = true;
}
else if (asciiValue == 10) // Missing CR
{
isMissingCR = true;
endOfRow = true;
}
else if (asciiValue == 13) // Missing LF
{
isMissingLF = true;
endOfRow = true;
}
else
endOfRow = true;
}
else if (asciiValue != -1)
currentLine += char.ConvertFromUtf32(asciiValue);
else
endOfRow = true;
}
}