【发布时间】:2011-09-09 14:13:23
【问题描述】:
我正在开发一个 C# 程序,该程序读取非常大的文件并检查它们的不同属性和字段。我一直在测试少于 100 万行的文件,它按预期进行。我最近在一个有 250 万行的文件上对其进行了测试,运行了 4 个小时。
我正在使用自定义阅读功能来读取每个字符,以便我可以找到所有 CR 和 LF,因为每一行都包含它们非常重要。我已经单独测试了 Reading 功能,读取文件大约需要 14 分钟,我认为这足以读取 250 万行 1500 个字符中的每个字符。我将包括阅读功能,但这似乎不会导致问题。
我的阅读函数将每个字符添加到一个字符串中,然后我检查字符串中的不同值。例如,行长度是否正确,文件是否包含标题,标题是否包含正确的值。以及特定值,例如 char 位置 403-404 是一个数字,字段 1250-1300 不是 null 等等。
我的问题是我可以做些什么来找出导致程序变慢的原因并提高我的程序效率?我试过检查每行循环开始和结束的时间,它似乎没有改变。但是,每 100,000 次所需的时间明显长于前一次。例如,处理线 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;
}
}
【问题讨论】:
-
我没有,有什么软件可以推荐的吗?
-
visual studio 已经进入了这个功能(至少在专业版中)
标签: c# visual-studio-2010 c#-4.0 file-io streamreader