문제

메모리 사용에 관한 LINQ-to-SQL에 문제가 있습니다. Windows 서비스에서 일부 처리를 수행하고 있으며 컨텍스트에서 철회하는 많은 양의 데이터를 통해 반복되고 있습니다. 예 - 저장된 절차 로이 작업을 수행 할 수 있다는 것을 알고 있지만 이상적인 솔루션이 아닌 이유가 있습니다.

어쨌든, 내가 기본적으로 보는 것은 내가 전화를 한 후에도 메모리가 출시되지 않는다는 것입니다. context.SubmitChanges(). 그래서 나는 결국 100 개의 레코드를 시간에 가져 오거나 여러 가지 맥락을 만들고 모두 별도의 작업을 수행하도록하는 것과 같은 모든 종류의 이상한 일을해야합니다. 내가 똑같이 유지한다면 DataContext 그리고 나중에 다른 통화에 사용하면 점점 더 많은 기억을 먹습니다. 내가 전화하더라도 Clear() "에"var tableRows"쿼리가 나에게 돌아 오는 배열, null로 설정하고 SYstem.GC.Collect() - 여전히 메모리를 해제하지 않습니다.

이제 나는 당신이 어떻게 사용 해야하는지에 대해 몇 가지를 읽었습니다 DataContexts 신속하게 빠르게 폐기하지만, 메모리가 무료임을 보장하기 위해 특정 지점에서 모든 데이터 (또는 특정 테이블의 모든 추적 데이터)를 버리는 컨텍스트를 강요하는 방법 인 것 같습니다.

메모리가 릴리스되었다는 단계를 아는 사람이 있습니까?

도움이 되었습니까?

해결책

객체 추적 세트가 필요하지 않은 경우 DataContext.ObjectTrackingEnabled 에게 거짓. 필요한 경우 반사를 사용하여 내부를 호출 할 수 있습니다. DataContext.clearCache (), 당신은 내부 이후로, 그것은 미래 버전의 프레임 워크에서 사라질 수 있음을 알고 있어야합니다. 그리고 내가 알 수있는 한, 프레임 워크 자체는 그것을 사용하지 않지만 하다 객체 캐시를 지우십시오.

다른 팁

DataContext는 모든 객체를 가져온 모든 객체를 추적합니다. 수집 된 쓰레기가 될 때까지 이것을 풀지 않을 것입니다. 또한, 그것을 구현합니다 IDisposable, 당신은 전화해야합니다 Dispose 또는 사용하십시오 using 성명.

이것은 올바른 방법입니다.

using(DataContext myDC = new DataContext)
{
  //  Do stuff
} //DataContext is disposed

David가 지적했듯이 사용 블록을 사용하여 Datacontext를 처리해야합니다.

주요 관심사는 많은 데이터 컨트리 텍스트 객체를 생성하고 처리하는 것 같습니다. 이것이 LINQ2SQL이 설계된 방식입니다. DataContext는 짧은 수명을 갖기위한 것입니다. DB에서 많은 데이터를 가져 오기 때문에 많은 메모리 사용이있을 것입니다. 데이터를 청크로 처리하여 올바른 길을 가고 있습니다.

많은 Datacontexts를 만드는 것을 두려워하지 마십시오. 그들은 그렇게 사용하도록 설계되었습니다.

고마워요 - 클리어 캐시 방법을 확인하겠습니다. 설명을 위해 (미래의 독자를 위해), 내가 메모리를 받고있는 상황은 다음과 같습니다.

using(DataContext context = new DataContext())
{
   while(true)
   {
      int skipAmount = 0;
      var rows = context.tables.Select(x => x.Dept == "Dept").Skip(skipAmount).Take(100);

      //break out of loop when out of rows

      foreach(table t in rows)
      {
         //make changes to t   
      }

      context.SubmitChanges();
      skipAmount += rows.Count();

      rows.Clear();
      rows = null;

      //at this point, even though the rows have been cleared and changes have been
      //submitted, the context is still holding onto a reference somewhere to the
      //removed rows.  So unless you create a new context, memory usuage keeps on growing
   }
}

방금 비슷한 문제를 겪었습니다. 제 경우에는 속성을 설정하는 데 도움이되었습니다 DataContext.ObjectTrackingEnabled 거짓. 그러나 다음과 같이 행을 반복하는 경우에만 작동합니다.

using (var db = new DataContext())
{
    db.ObjectTrackingEnabled = false;
    var documents = from d in db.GetTable<T>()
                     select d;
    foreach (var doc in documents)
    {
        ...
    }
}

예를 들어, 쿼리에서 methods toArray () 또는 tolist ()를 사용하는 경우 - 효과가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top