【发布时间】:2012-03-14 20:18:17
【问题描述】:
我有 2 个大文本文件,每个文件有 400,000 行文本。在 File2.txt 中,我需要从 File1.txt 的当前行中找到包含 userId 的行。在 File2.txt 中找到正确的行后,我会进行一些计算并将该行写入一个新的文本文件。
我为此创建的代码运行速度非常慢。我尝试过以各种方式重写它,但它总是不断前进并且永远不会完成。我怎样才能快速做到这一点?
private void btnExecute_Click(object sender, EventArgs e) {
string line1 = "";
string line2 = "";
//the new text file we are creating. Located in IVR_Text_Update\bin\Debug
StreamWriter sw = new StreamWriter("NewFile.txt");
//the new text file which contains the registrants which need removing
StreamWriter sw_removeRegs = new StreamWriter("RemoveRegistrants.txt");
//address has changed so we write the line to the address file
StreamWriter sw_addressChange = new StreamWriter("AddressChanged.txt");
List<string> lines_secondFile = new List<string>();
using (StreamReader sr = new StreamReader(openFileDialog2.FileName)) {
string line;
while ((line = sr.ReadLine()) != null) {
lines_secondFile.Add(line);
}
}
//loop through the frozen file one line at a time
while ((line1 = sr1.ReadLine()) != null) {
//get the line from the update file, assign it to line2
//function accepts (userId, List)
line2 = getLine(line1.Substring(3, 8), lines_secondFile);
//if line2 is null then userId was not found therefore we write
//the line to Remove Registrants file
if (line2 == null) {
sw_removeRegs.Write(line1 + Environment.NewLine);
}
//address between the two lines was found to be different so we still write
//them to the new text file but don't update codes
else if (line1.Substring(93, 53) != line2.Substring(93, 53)) {
sw_addressChange.Write(line1 + Environment.NewLine);
sw.Write(line1 + Environment.NewLine);
}
//test for null then write the new line in our new text file
else if ((line1 != null) && (line2 != null)) {
sw.Write(line1.Substring(0, 608) +
line2.Substring(608, 9) +
line2.Substring(617, 9) +
line2.Substring(626, 9) +
line2.Substring(635, 9) +
line2.Substring(644, 9) +
line2.Substring(653, 9) +
line2.Substring(662, 9) +
line2.Substring(671, 9) +
line2.Substring(680, 9) +
line1.Substring(680, 19) +
Environment.NewLine);
}
}
textBox1.Text = "Finished.";
sr1.Close();
sw.Close();
sw_removeRegs.Close();
sw_addressChange.Close();
}
//returns the line from the update file which has the corresponding userId
//from the frozen file
string getLine(string userId, List<string> lines_secondFile) {
foreach (string currentLine in lines_secondFile) {
if (currentLine.Contains(userId)) {
return currentLine;
}
}
return null;
}
【问题讨论】:
-
磁盘读取需要很长时间。您总是可以定期向控制台写入内容,让您知道您的应用程序正在执行某些操作。
-
您可能想要添加一些自记录变量名称,您当前的代码非常神秘 ;-)
标签: c# performance optimization