2014-09-17 2 views
0

Я пытаюсь перенести данные из базы данных Microsoft SQL в Elasticsearch. Я использую EF 6 для создания моделей (первый код из базы данных) и NEST для сериализации объектов в Elasticsearch.C# Сериализация больших наборов данных

Если я использую Lazy loading, он работает нормально, но невероятно медленно (так медленно его нельзя использовать). Если я переключаюсь на жадную загрузку, добавив следующую строку:

public MyContext() : base("name=MyContext") 
{ 
    this.Configuration.LazyLoadingEnabled = false; 
} 

И Сериализация так:

ElasticClient client = new ElasticClient(settings); 

var allObjects = context.objects 
    .Include("item1") 
    .Include("item2") 
    .Include("item2.item1") 
    .Include("item2.item1.item"); 

client.IndexMany(allObjects); 

Я в конечном итоге получить System.OutOfMemoryException, прежде чем Сериализация происходит (так просто путем загрузки данные). У меня около 2,5 ГБ доступной памяти, и мы говорим о 110 000 элементов в базе данных.

Я попытался Сортировка данных, а затем использование Пропустить и принять только Сериалировать определенное количество объектов за раз, однако мне удалось получить 60 000 объектов, вставленных в Elasticsearch, до окончания работы. Похоже, что сборщик мусора не освобождает достаточно памяти, даже если я действительно назвал это явно после вставки определенного количества объектов в Elasticsearch.

Есть ли способ для загрузки нагрузки определенного количества объектов? Или другой подход к сериализации больших наборов данных?

+0

Отъезд 'GC.AddMemoryPressure()' – Sam

+0

Благодарим за подсказку. К сожалению, это не влияет на использование памяти в моем приложении. – andreasnauta

ответ

0

Оглядываясь назад, глупая ошибка. Делая это, мне удалось достичь своей цели:

int numberOfObjects; 

using (var context = new myContext()) 
{ 
    numberOfObjects = context.objects.Count(); 
} 

for (int i = 0; i < numberOfObjects; i += 10000) 
{ 
    using (var context = new myContext()) 
    { 
     var allObjekts = context.objects.OrderBy(s => s.ID) 
      .Skip(i) 
      .Take(10000) 
      .Include("item1") 
      .Include("item2") 
      .Include("item2.item1") 
      .Include("item2.item1.item"); 

      client.IndexMany(allObjekts); 
    } 
} 

Это позволило коллектор Gargage делать свою работу, поскольку контекст был завернут в течение петли. Я не знаю, есть ли более быстрый способ, я могу вставить около 100 000 объектов в Elasticsearch примерно за 400 секунд.

Смежные вопросы