我读了一个文件,对于文件中的每一行,我需要获取更多信息。
这涉及从我的非SSD驱动器读取数据。
为了加快速度,我试图并行处理,但这意味着许多进程正在尝试从同一个驱动器中读取不同的文件。
所以我的整体速度并不比我顺序完成时快。
我有什么办法可以改善表现吗?
public void LoadModelListPAR()
{
var lines = File.ReadAllLines(@"D:\jobs\modelList");
modelData = new List<ModelData>();
Parallel.ForEach(lines, (line) =>
{
string modelName = line.Split('_')[2].Replace("-1m", "");
LoadTrades(modelName, @"D:\jobs\" + line);
});
}
public void LoadTrades(string modelName, string modelDir)
{
var lines = File.ReadAllLines(modelDir+"\\trades.txt");
foreach (var line in lines)
{
modelData.Add(new ModelData(line));
}
}
}
答案 0 :(得分:0)
我认为您应该做的是异步读取文件,而不是并行读取。通过这样做,您将使用主线程上的时间,否则只是等待文件操作完成。尝试这样的事情:
public async void LoadModelListPAR()
{
var lines = File.ReadAllLines(@"D:\jobs\modelList");
modelData = new List<ModelData>();
foreach(var line in lines)
{
string modelName = line.Split('_')[2].Replace("-1m", "");
await LoadTrades(modelName, @"D:\jobs\" + line);
};
}
public async Task LoadTrades(string modelName, string modelDir)
{
using (var f = new FileStream(path: modelDir + "\\trades.txt", mode: FileAccess.Read, isAsync: true))
{
var buf = new byte[f.Length];
await f.ReadAsync(buf, 0, f.Length);
var s = Encoding.UTF8.GetString(buf);
foreach (var line in s.Split('\n'))
{
modelData.Add(new ModelData(line));
}
}
}