我正在创建一个网络应用程序,该应用程序将拥有世界上每个城镇、地区和国家的数据库,以允许将其他对象映射到某个位置。作为应用程序的一部分,我希望用户能够搜索一个地方,为此我使用 Elastic Search 来索引所有内容。为了与 Elastic Search 交互,我使用了 NEST。
我有以下代码:
public void RefreshLocationIndex()
{
int count;
using (var dbContext = new ModelContext())
{
IndexMany(dbContext.Countries, "Country");
}
using (var dbContext = new ModelContext())
{
count = dbContext.Regions.AsNoTracking().Count();
}
for (var i = 0; i <= count; i += BATCH_SIZE)
{
using (var innerContext = new ModelContext())
{
IndexMany(innerContext.Regions.OrderBy(t => t.RegionID).Skip(i).Take(BATCH_SIZE),
"Region");
}
}
using (var dbContext = new ModelContext())
{
count = dbContext.Towns.AsNoTracking().Count();
}
for (var i = 0; i <= count; i += BATCH_SIZE)
{
using (var innerContext = new ModelContext())
{
IndexMany(innerContext.Towns.AsNoTracking().OrderBy(t => t.TownID).Skip(i).Take(BATCH_SIZE), "Town");
}
}
}
public void IndexMany(IQueryable<Entity> objects, string type)
{
var itemCount = objects.Count();
if (itemCount > 0)
{
SearchClient.Instance.IndexManyAsync(objects, SearchClient.Instance.Settings.DefaultIndex, type);
}
}
如您所见,我将非常大的表分成批次,以避免将大量表加载到内存中。问题是这不起作用,我不断出现内存不足的异常。我认为为每个批次使用一个新的上下文可以避免这个问题,因为当上下文被释放时,它会释放它加载的所有实体,但似乎并非如此。有任何想法吗?
正如数据量的指示: Country 表有 193 条记录 Region 表有 80,523 条记录 Town 表有 2,743,469 条记录