我怎样才能加快并行同一磁盘的读取速度

时间:2016-05-11 11:09:42

标签: c# parallel-processing

我读了一个文件,对于文件中的每一行,我需要获取更多信息。

这涉及从我的非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));
            }
         }
}

1 个答案:

答案 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));
            }
        }
    }