【问题标题】:Linq and adding a large amount of dataLinq和添加大量数据
【发布时间】:2011-10-07 04:28:19
【问题描述】:

我需要向sqlite db 插入大量数据。
我使用Linq to Entities

我无法添加大量数据 1M+
内存不足或时间很长。

此代码 - 速度快,但需要大量内存:

// query - IQueryable of DbfRecord
// db - ObjectContext
int i = 0;
foreach (var item in query) {
    db.AddToKladrs(new Kladr() {
        Id = item.GetField(0),
        ParentId = item.GetField(1),
        RegionId = item.GetField(3),
        Name = item.GetField(2),
        Index = item.GetField(4)
    });
    if(++i % 4000 == 0)
        db.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
}


这段代码 - 不是资源密集型,但非常慢

// query - IQueryable of DbfRecord
// db - ObjectContext
foreach (var item in query) {
    db.ExecuteStoreCommand("insert into [Kladr] values({0}, {1}, {2}, {3}, {4})",
        item.GetField(0),
        item.GetField(1),
        item.GetField(3),
        item.GetField(2),
        item.GetField(4)
    );
}

我错过了 try-catch 构造和 ghost 类型。

帮我找到最佳解决方案!

【问题讨论】:

  • 保存每一行或每 4000 行是一个非常极端的拆分。您是否尝试过保存每 100 或 200 个?
  • 当然会降低生产力。但是 4000 是随机选择的 =) 但它工作得很快!

标签: c# performance linq-to-entities out-of-memory large-data


【解决方案1】:

您可以使用SqlBulkCopy 复制大量数据。没有用 SQL lite 尝试过,但它应该可以工作。

Link 1
Link 2

更新:

这是 Marc Gravell 的一个很好的答案。 how-to-do-a-bulk-insert-linq-to-entities

【讨论】:

  • 这不适用于DbConnection。我无法将 SQLiteConnection (DbConnection) 转换为 SqlConnection =( 我使用 System.Data.SQLite
  • 我刚刚发现sqlite不支持批量插入,但是你可以使用一个事务来做同样的事情。
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多