1

我有一个包含大约 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 查询之后失败了!

4

2 回答 2

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
        });
于 2011-02-03T17:36:15.467 回答
2

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

话虽如此,这可以以更清洁的方式处理。您应该考虑改用自定义分区程序,而不是使用这种方法。这将大大提高效率,因为每次调用 Skip/Take 都会强制重新评估您的序列。

于 2011-02-03T17:36:51.457 回答