【发布时间】: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