3

csv ファイルを読み取り、(LINQ によって) 操作された結果を返す関数があります。用途ごとにデータを非常に異なる方法でスライスする必要があり、コードプロジェクトの「A Fast CSV Reader」を使用すると、各ファイルを2回開く必要があるため、2回読み取り、毎回LINQで直接操作する方が高速ですDataTable に読み込むよりも。

個々の関数呼び出し (imppow または impfuel) には 2 秒強かかります。

6 回の呼び出しに対する単純な for ループ (13 秒かかります):

string[] pathstring = { @"C:\Temp\Hourly1.txt", @"C:\Temp\Hourly2.txt", @"C:\Temp\Hourly3.txt" };
string[] pathgran = { "M", "Q", "Y" };
for (int i=0; i < 3; i++)
{
     var respow = imppow(pathstring[i], pathgran[i]);
     Console.WriteLine(respow[0]);

     var resfuel = impfuel(pathstring[i], pathgran[i]);
     Console.WriteLine(resfuel[0]);
}

このように並列化すると 3 秒短縮されますが、それ以上ではありません。

Parallel.For(0, 3, (i) =>
{
    var respow = imppow(pathstring[i], pathgran[i]);
    Console.WriteLine(respow[0]);

    var resfuel = impfuel(pathstring[i], pathgran[i]);
    Console.WriteLine(resfuel[0]);
});

前述のように、1 回の呼び出しには約 2 秒かかります。マルチスレッドまたは sth を使用してランタイムをさらにダウンさせることはできますか? ありがとう。

関数の 1 つの下:

static object[] impfuel(string filepath, string gran)
{  
    using (CsvReader csv =
           new CsvReader(new StreamReader(filepath), true))
    {
        csv.SupportsMultiline = false;
        var results = csv.Select(r => new { yr = r[1], qr = r[3], mt = r[4], tar = r[7], mac = r[8], fuel = r[9], rg = r[10], rt = r[11], fp = r[22], fi = r[24] })
                         .Where(a => a.rt == "F")
                         .GroupBy(a => new { a.rg, a.fuel, a.tar, a.mt })
                         .Select(g => new { Rpg = g.Select(a => a.rg).First(), Fue = g.Select(a => a.fuel).First(), Tari = g.Select(a => a.tar).First(), Mon = g.Select(a => a.mt).First(), AverageA = g.Average(a => double.Parse(a.fp)), SumA = g.Sum(a => double.Parse(a.fi)) })
                         .ToArray();
        return results;
    }
}

static object[] imppow(string filepath, string gran)
{  
using (CsvReader csv =
       new CsvReader(new StreamReader(filepath), true))
{
    csv.SupportsMultiline = false;
    var results = csv.Select(r => new { yr = r[1], qr = r[3], mt = r[4], tar = r[7], mac = r[8], rg = r[10], rt = r[11], pp = r[17], pi = r[19] })
                     .Where(a => a.rt == "M")
                     .GroupBy(a => new { a.rg, a.tar, a.mt })
                     .Select(g => new { Rpg = g.Select(a => a.rg).First(), Tari = g.Select(a => a.tar).First(), Mon = g.Select(a => a.mt).First(), AverageA = g.Average(a => double.Parse(a.pp)), SumA = g.Sum(a => double.Parse(a.pi)) })
                     .ToArray();
    return results;
}

}

4

1 に答える 1