【发布时间】:2011-02-13 05:32:02
【问题描述】:
我在我的应用程序中处理 100 万条记录,这些记录是从 MySQL 数据库中检索的。为此,我使用 Linq 获取记录并使用 .Skip() 和 .Take() 一次处理 250 条记录。对于每条检索到的记录,我需要创建 0 到 4 个项目,然后将它们添加到数据库中。因此,必须创建的平均项目总数约为 200 万。
IQueryable<Object> objectCollection = dataContext.Repository<Object>();
int amountToSkip = 0;
IList<Object> objects = objectCollection.Skip(amountToSkip).Take(250).ToList();
while (objects.Count != 0)
{
using (dataContext = new LinqToSqlContext(new DataContext()))
{
foreach (Object objectRecord in objects)
{
// Create 0 - 4 Random Items
for (int i = 0; i < Random.Next(0, 4); i++)
{
Item item = new Item();
item.Id = Guid.NewGuid();
item.Object = objectRecord.Id;
item.Created = DateTime.Now;
item.Changed = DateTime.Now;
dataContext.InsertOnSubmit(item);
}
}
dataContext.SubmitChanges();
}
amountToSkip += 250;
objects = objectCollection.Skip(amountToSkip).Take(250).ToList();
}
现在在创建项目时出现问题。运行应用程序时(甚至不使用 dataContext),内存会持续增加。就好像这些物品永远不会被处理掉。有没有人注意到我做错了什么?
提前致谢!
【问题讨论】:
-
你如何初始化你的 objectCollection ?
-
IQueryable
-
为什么要批量处理 250 个而不是只迭代 objectCollection?
-
实际上,他的拉动方法很好。只是迭代还涉及以块的形式提取数据以及如何分页取决于 Linq 实现。此外,您还获得了每次运行必须准确更新 250 个项目而不是任意数量的好处,并依靠框架正确批处理这些内容。
-
我会得到一个 Sql Timeout 异常,从我正在使用的数据库中获取 100 万条记录需要很长时间。
标签: c# linq-to-sql memory object out-of-memory