我有一個函數讀取一個csv文件並返回操作(LINQ)結果。我需要打開每個文件兩次,因爲我需要根據不同的用途對數據進行非常不同的分割,並且使用代碼項目中的「快速CSV閱讀器」,我使用它的速度更快,可以兩次讀取,並且每次直接使用LINQ進行操作比將其讀入DataTable中。與LINQ並行csv處理
單獨的每個函數調用(imppow或impfuel)都需要超過2秒。
簡單的for循環六個電話(需要13secs):
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]);
});
至於說一個呼叫大約需要2秒。我可以通過使用多線程還是進一步降低runtim? 謝謝。
下面的功能之一:
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;
}
}
你可以將文件緩存在內存中並使用MemoryStreams嗎?消除文件I/O可能會有所幫助。 –
Parallel.For()使用多個線程(如有必要並且可用) – EkoostikMartin
感謝Dan!你有鏈接或樣本?從來沒有使用記憶流 – nik