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