在LINQ Take中使用并行扩展或并行LINQ

问题描述 投票:1回答:2

我有一个大约有500万行的数据库。我正在尝试为数据库生成XML字符串并将它们推送到服务。该服务不是一次执行此操作,而是一次支持1000条记录。目前,这非常缓慢,每1000条记录占用10秒(包括写回数据库并上传到服务)。

我试着让下面的代码工作,但是失败了...当我尝试它时我遇到了崩溃。有任何想法吗?

    var data = <insert LINQ query here>
    int take = 1000
    int left = data.Count();

    Parallel.For(0, left / 1000, i =>
        {
            data.Skip(i*1000).Take(1000)...
            //Generate XML here.
            //Write to service here...
            //Mark items in database as generated.
        });
        //Get companies which are still marked as not generated.
        //Create XML.
        //Write to Service.

我得到一个崩溃告诉我索引超出范围。如果left是500万,那么循环中的数字应该不超过5000.如果我再乘以1000,我不应该超过500万。我不介意它是否有效,然后失败,但它只是在SQL查询后失败!

c# .net linq parallel-extensions
2个回答
2
投票

我怀疑索引越界错误是由当前显示的代码以外的代码引起的。

话虽如此,这可以更清洁的方式处理。您应该考虑切换到using a custom partitioner,而不是使用这种方法。这将大大提高效率,因为每次调用Skip / Take都会强制重新评估您的序列。


3
投票

我认为它不喜欢你的最后一个索引值 - 它应该是左/ 1000 -1,而不是左/ 1000:

Parallel.For(0, left / 1000 - 1, i =>
        {
            data.Skip(i*1000).Take(1000)...
            //Generate XML here
            //Write to Service here...
            //mark items in DB as generated
        });
© www.soinside.com 2019 - 2024. All rights reserved.