如何获得LINQ to SQL submitchanges的百分比?
我想知道是否有其他人问过类似的问题。
基本上,我有一个巨大的树,我正在使用LINQ对象在RAM中构建,然后我使用DataContext.SubmitChanges()
一次性转储它。
它可以工作,但我找不到如何给用户一个目前为止查询进展程度的视觉指示。 如果我最终能够实现某种进度条,即使性能损失很小,这也会很棒。
请注意,我有相当多的行要放入数据库,超过750,000行。 我没有完全定时,但确实需要很长时间才能将它们放入。
编辑:我想我最好先说明我在做什么。
基本上,我正在用指环王建造一个后缀树。 因此,存在许多节点,并且某些节点具有与它们相关联的位置(恰好在后缀的末尾处的节点)。 我正沿着这些线构建Linq对象。
suffixTreeDB.NodeObjs.InsertOnSubmit(new NodeObj() { NodeID = 0, ParentID = 0, Path = "$" });
在RAM中完全生成后缀树(只需几秒钟)后,我调用suffixTreeDB.submitChanges();
我想知道的是,如果有更快的方法这样做。 谢谢!
编辑2:我做了一个秒表,显然数据库写入需要6分钟。
我建议你划分你正在进行的调用,因为它们是在不同的单独调用中发送的。 这也将减少事务的大小(linq在调用submitchanges时会这样做)。
如果将它们分成10个75.000的块,则可以在1/10比例上提供粗略估计。
更新1:重新阅读你的post和你的新评论后,我认为你应该看一下SqlBulkCopy。 如果您需要改善操作时间,那就是要走的路。 检查这个相关的问题/答案: 在SQL Server中批量插入大量数据的最快方法是什么(C#client)
通过使用ctx.Log和ActionTextWriter,我能够获得ctx.submitchanges()的百分比进度
ctx.Log = new ActionTextWriter(s => { if (s.StartsWith("INSERT INTO")) insertsCount++; ReportProgress(insertsCount); });
有关详情,请访问我的博客http://epandzo.wordpress.com/2011/01/02/linq-to-sql-ctx-submitchanges-progress/
和stackoverflow问题LINQ to SQL SubmitChangess()进度
这不是理想的,但您可以创建另一个线程,定期查询您正在填充的表,以计算已插入的记录数。 我不知道如果你在一个事务中运行,这将如何/如果这可行,因为可能有锁定/等。
我真正认为我需要的是一种Bulk-Insertforms,但看起来Linq不支持它。