C# 如何使我的StreamWriter更快?
我有这样的C代码:C# 如何使我的StreamWriter更快?,c#,filestream,streamreader,streamwriter,C#,Filestream,Streamreader,Streamwriter,我有这样的C代码: string strFilePath = @ "E:\input.txt"; string strFilePath2 = @ "E:\output.txt"; const int BufferSize = 65536; // 64 Kilobytes FileStream fs = new FileStream(strFilePath2, FileMode.OpenOrCreate); using(StreamWriter sw = new StreamWriter(fs))
string strFilePath = @
"E:\input.txt";
string strFilePath2 = @
"E:\output.txt";
const int BufferSize = 65536; // 64 Kilobytes
FileStream fs = new FileStream(strFilePath2, FileMode.OpenOrCreate);
using(StreamWriter sw = new StreamWriter(fs)) {
for (int ww = 0; ww < File.ReadLines(strFilePath).Count(); ww++) {
string tx2 = GetLine(strFilePath, ww).Replace("||", "| |");
var first = String.Join("", tx2.TakeWhile(c => Char.IsDigit(c) || c == '|' || c == '-'));
var third = String.Join("", tx2.Reverse().TakeWhile(c => Char.IsDigit(c) || c == '|' || c == '-').Reverse());
var second = tx2.Replace(first, "").Replace(third, "");
string awal = first.ToString();
string dua = third.ToString();
string gabung = (awal + dua).Replace("||", "|") + Environment.NewLine;
string[] pdua = dua.Split('|');
int totalkanan = int.Parse(pdua[1]) + int.Parse(pdua[2]) + int.Parse(pdua[3]) + int.Parse(pdua[4]) + int.Parse(pdua[5]) + int.Parse(pdua[6]) + int.Parse(pdua[7]) + int.Parse(pdua[8]) + int.Parse(pdua[9]) + int.Parse(pdua[10]) + int.Parse(pdua[11]) + int.Parse(pdua[12]) + int.Parse(pdua[13]) + int.Parse(pdua[14]) + int.Parse(pdua[15]) + int.Parse(pdua[16]) + int.Parse(pdua[17]) + int.Parse(pdua[18]) + int.Parse(pdua[19]);
if (totalkanan > 0) {
sw.Write(gabung);
}
}
}
输出:
937|41|0|0|0|0|484|0|0|0|0|0|0|0|20|2582|4342|1|0|0|0|0|470|0|0|0|0|0|0|0|0|0|0|0|
937|42|4335|1|0|0|470|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
937|43|0|0|0|0|483|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
937|44|7928|20|4348|1|481|0|0|0|0|0|0|0|42|2583|7928|-20|4348|-1|0|0|483|0|0|0|0|0|0|0|0|0|0|0|
937|45|7927|20|4347|1|479|0|0|0|0|0|0|0|42|2584|7927|-20|4347|-1|0|0|481|0|0|0|0|0|0|0|0|0|0|0|
937|46|7926|20|4346|1|477|0|0|0|0|0|0|0|42|2585|7926|-20|4346|-1|0|0|479|0|0|0|0|0|0|0|0|0|0|0|
这个程序正在运行,但问题是当输入文件有17k++行时,写入进度非常慢,但当输入文件只有4k+它只有大约10秒时,逻辑是为什么4k需要10秒,而17k需要5分钟以上?
有解决这个问题的建议吗?提前谢谢你 您的GetLine方法必须读取整个文件,直到有问题的行,每次读取一行
因此,您将看到性能呈指数级下降
为什么不边走边读每一行呢
string strFilePath = @"E:\input.txt";
string strFilePath2 = @"E:\output.txt";
const int BufferSize = 65536; // 64 Kilobytes
using (StreamWriter sw = new StreamWriter(fs))
{
foreach (var line in File.ReadLines(strFilePath))
{
string tx2 = line.Replace("||", "| |");
var first = String.Join("", tx2.TakeWhile(c => Char.IsDigit(c) || c == '|' || c == '-'));
var third = String.Join("", tx2.Reverse().TakeWhile(c => Char.IsDigit(c) || c == '|' || c == '-').Reverse());
var second = tx2.Replace(first, "").Replace(third, "");
string awal = first.ToString();
string dua = third.ToString();
string gabung = (awal + dua).Replace("||", "|") + Environment.NewLine;
string[] pdua = dua.Split('|');
int totalkanan = int.Parse(pdua[1]) + int.Parse(pdua[2]) + int.Parse(pdua[3]) + int.Parse(pdua[4]) + int.Parse(pdua[5]) + int.Parse(pdua[6]) + int.Parse(pdua[7]) + int.Parse(pdua[8]) + int.Parse(pdua[9]) + int.Parse(pdua[10]) + int.Parse(pdua[11]) + int.Parse(pdua[12]) + int.Parse(pdua[13]) + int.Parse(pdua[14]) + int.Parse(pdua[15]) + int.Parse(pdua[16]) + int.Parse(pdua[17]) + int.Parse(pdua[18]) + int.Parse(pdua[19]);
if (totalkanan > 0)
{
sw.Write(gabung);
}
}
}
您正在以低效的方式进行大量字符串操作,这将导致大量的分配和大量的垃圾收集,这两者都会降低您的速度
看起来您正在读取文件一次以获得行数,然后每行重新读取该文件,以从文件中获取下一行
该类还有其他更有效的方法,请改为执行以下操作:
int lineNumber = 0;
foreach (var line in File.ReadLines(path))
{
lineNumber++;
// process line
}
您还知道数组从索引0开始,pdua[1]是数组中的第二项…复杂性不是线性的:-您应该给我们一些输入来测试int ww=0;ww
string strFilePath = @"E:\input.txt";
string strFilePath2 = @"E:\output.txt";
const int BufferSize = 65536; // 64 Kilobytes
using (StreamWriter sw = new StreamWriter(fs))
{
foreach (var line in File.ReadLines(strFilePath))
{
string tx2 = line.Replace("||", "| |");
var first = String.Join("", tx2.TakeWhile(c => Char.IsDigit(c) || c == '|' || c == '-'));
var third = String.Join("", tx2.Reverse().TakeWhile(c => Char.IsDigit(c) || c == '|' || c == '-').Reverse());
var second = tx2.Replace(first, "").Replace(third, "");
string awal = first.ToString();
string dua = third.ToString();
string gabung = (awal + dua).Replace("||", "|") + Environment.NewLine;
string[] pdua = dua.Split('|');
int totalkanan = int.Parse(pdua[1]) + int.Parse(pdua[2]) + int.Parse(pdua[3]) + int.Parse(pdua[4]) + int.Parse(pdua[5]) + int.Parse(pdua[6]) + int.Parse(pdua[7]) + int.Parse(pdua[8]) + int.Parse(pdua[9]) + int.Parse(pdua[10]) + int.Parse(pdua[11]) + int.Parse(pdua[12]) + int.Parse(pdua[13]) + int.Parse(pdua[14]) + int.Parse(pdua[15]) + int.Parse(pdua[16]) + int.Parse(pdua[17]) + int.Parse(pdua[18]) + int.Parse(pdua[19]);
if (totalkanan > 0)
{
sw.Write(gabung);
}
}
}
int lineNumber = 0;
foreach (var line in File.ReadLines(path))
{
lineNumber++;
// process line
}