1

我有一个场景,我需要将记录的插入(插入)划分到一个表中,这样它不会那么慢,目前我有 81K 行记录要插入,前几天使用当前进程大约需要 4 -5 小时完成。我想增强线程过程,或者只是将插入分成批,比如 20 个(81,000/20),每次使用 for 循环处理 4k 行。哪一个是最好的推荐。

这是我目前的代码:

iProcs = 81000/20;
Thread[] threads = new Thread[iProcs]
                    for (int i = 0; i < iProcs; i++)
                {
                    //range of values to get
                    iStart = iRange * i;
                    if (i == iProcs - 1)  //for last processor use the rest of the list
                        iEnd = packageList.Count - iStart;
                    else
                        iEnd = iRange;

                    var listSubset = packageList.GetRange(iStart, iEnd).ToList();
                    Thread myThread = new Thread(
                        delegate()
                        {
                            service.PostToClient(listSubset);
                        }
                    );
                    myThread.Start();
                    threads[i] = myThread;
                }
// all threads should complete before we continue with main.
foreach (Thread thread in threads) { thread.Join(); }

上面的代码很慢,如果这更有效,我没有在下面测试这个:

for (int i = 0; i <= iProcs; i++)
                {

                    iStart = i * iRange;
                    // lets add what's been processed
                    iEnd =  iRange;

                    // find out how much record is left to process
                    int cntleft = totalRec - iStart;

                    if (cntleft < iEnd)
                        iEnd =  cntleft;


                    // process data save images to db
                    var listSubset = packageList.GetRange(iStart, iEnd).ToList();
                   //   service.PostToDB(listSubset);


                }

我没有做过很多线程程序,所以我不是真正的专家,甚至不是它的平庸。

任何回应表示赞赏。谢谢你。

4

1 回答 1

1
  1. 如果可能,首先使用 SqlBulkCopy(用于 sql server)或其他 BulkCopy(取决于 DB 供应商)
  2. 如果您需要尽快插入数据,请在真实硬件上使用多个插入线程执行一些基准测试。通过这些数据,您可以优化插入线程的数量以获得最佳时间。
于 2013-10-18T15:31:15.037 回答