C# 如何使我的StreamWriter更快?

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))

我有这样的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)) {
    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;wwRegex.Replaces[A-Z]+[^\\\\\\\\]*,.ToList;是的,我知道如果数组从索引0开始,我会将其写入pdua[1],因为pdua[0]当我尝试控制台时是空的。写它:我的代码太可怕了很多字符串操作哈哈哈,我需要得到输出,但从来没有想过性能当我第一次写这个代码时,我尝试了这个,并给我一个错误,在int totalkanan上,它说超出范围,如果我像我的代码一样使用,它永远不会超出范围,为什么?Nvm,你的答案是ng对我来说!现在只需要大约20毫秒:
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
}