他のオブジェクトを場所にマッピングできるように、世界中のすべての町、地域、国にデータベースを持つ Web アプリを作成しています。アプリケーションの一部として、ユーザーが場所を検索できるようにしたいと考えています。そのために、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);
}
}
ご覧のとおり、非常に大きなテーブルをバッチに分割して、大量のメモリへのロードを回避しようとしています。問題は、これが機能していないことです。メモリ不足の例外が発生し続けています。コンテキストが破棄されると、読み込まれたすべてのエンティティが破棄されるため、バッチごとに新しいコンテキストを使用すると、この問題が回避されると思いましたが、そうではないようです。何か案は?
データ量の目安: 国テーブルには 193 件のレコードが含まれています 地域テーブルには 80,523 件のレコードがあります 町テーブルには 2,743,469 件のレコードがあります