【问题标题】:How to pass different range on parallel.for?如何在parallel.for上传递不同的范围?
【发布时间】:2015-09-24 16:29:04
【问题描述】:

我需要通过发送像 1-1000、1001-2000、2001-3000 等这样的跳过计数来并行处理单个文件

并行处理代码

var line = File.ReadAllLines("D:\\OUTPUT.CSV").Length;
Parallel.For(1, line, new ParallelOptions { MaxDegreeOfParallelism = 10 }, x              
=> {
  DoSomething(skip,take);
});

功能

public static void DoSomething(int skip, int take)
{
     //code here
}

如何根据我的要求并行发送skiptake 计数?

【问题讨论】:

    标签: c# parallel-processing plinq parallel-extensions


    【解决方案1】:

    您可以使用 PLINQ 轻松完成这些工作。如果你想要批量 1000,你可以这样做:

    const int BatchSize = 1000;
    
    var pageAmount = (int) Math.Ceiling(((float)lines / BatchSize));
    var results = Enumerable.Range(0, pageAmount)
                            .AsParallel()
                            .Select(page => DoSomething(page));
    
    public void DoSomething(int page)
    {
        var currentLines = source.Skip(page * BatchSize).Take(BatchSize);
        // do something with the selected lines
    }
    

    【讨论】:

    • 谢谢,但Enumerable.Range(1, pageAmount) 应该是Enumerable.Range(0, pageAmount-1) 对吧?
    • 在方法 DoSomething 我们第一次只得到 page= 1 对吗?所以source.Skip(page * BatchSize).Take(BatchSize) 将成为 source.Skip(1000).Take(1000)。因此第一次它会跳过 1000 行
    • 谢谢,我认为需要更改结束范围,即 pageAmountpageAmount-1
    • 我们跳过 4000 并取 1000 ,这意味着我们取最后一批,即 4001-5000 ,所以它应该 pageAmount-1
    • 我无法理解您的观点,行数=5000,然后 pageAmount = 5 ,它从 0 迭代,5-1 表示,总共 5 次迭代,即 0,1,2,3,4 行每次迭代的过程是 1-1000,1001-2000,2001-3000,3001-4000,4001-5000 所以所有的行都被处理了,如果我错了,请纠正我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2016-02-13
    • 1970-01-01
    相关资源
    最近更新 更多