2014-09-17 3 views
0

Microsoft SQL 데이터베이스에서 Elasticsearch로 데이터를 이동하려고합니다. 나는 모델을 생성하기 위해 EF 6 (데이터베이스에서 코드 우선)을 사용하고 객체를 Elasticsearch로 직렬화하기 위해 NEST를 사용하고있다.C# 큰 데이터 집합 serializer

지연로드를 사용하면 제대로 작동하지만 느리게 전송되므로 느리게 사용할 수 없습니다.

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.5GB의 사용 가능한 메모리가 있으며 데이터베이스에 약 110.000 개의 항목이 있습니다.

데이터 정렬을 시도한 다음 한 번에 일정량의 개체를 직렬화하기 위해 건너 뛰기 및 가져 오기를 시도했지만 메모리가 부족하기 전에 Elasticsearch에 60.000 개의 개체 만 삽입 할 수있었습니다. 특정 양의 객체를 Elasticsearch에 삽입 한 후에도 가비지 수집기가 메모리를 충분히 확보하지 못하는 것처럼 보입니다.

Eager가 특정 개수의 객체를로드 할 수있는 방법이 있습니까? 대형 데이터 집합을 직렬화하는 또 다른 접근법은 무엇입니까?

+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 수집기가 일을 할 수있었습니다. 더 빠른 방법이 있는지 나는 모른다. Elasticsearch에 약 100.000 개체를 약 400 초 안에 삽입 할 수있다.

관련 문제