2016-02-18 4 views
3

Я создал приложение, которое читает CSV файлов, создает DataServiceContext и массовые вставки данных на мой удаленный сервер OData API.Утилизация DataServiceContext?

Однако через 5 минут после запуска импорта записей 30,000 я обнаружил, что приложение по-прежнему использует 750 МБ памяти!

Есть ли что-нибудь, что я должен сделать, чтобы уменьшить использование памяти? Или, по крайней мере, собрать мусор раньше? Он, похоже, не реализует IDisposable, и мой google-fu не смог меня. Благодарю.

ответ

1

У меня была аналогичная проблема с классом Microsoft.OData.Client.DataServiceContext, который похож на System.Data.Services.Client.DataServiceContext.

Что происходит, так это то, что DataServiceContext имеет EntityTracker, который используется для отслеживания любых изменений, сделанных для повторяющихся объектов. После некоторого осмотра я увидел, что DataServiceContext имеет свойство MergeOption. Для того, чтобы решить вашу проблему установить его NoTracking следующим образом:

dsc.MergeOption = MergeOption.NoTracking; 

Это должно быть сделано один раз, прежде чем начать перечисление, будь то в конструкторе или где-нибудь перед циклом.

1

Я использую это после обработки, чтобы очистить контекст, если он кому-то поможет.

public static void ClearChanges(this DataServiceContext context) 
{ 
    foreach (var entity in context.Entities.ToList()) 
    { 
     context.Detach(entity.Entity); 
    } 

    foreach (var link in context.Links.ToList()) 
    { 
     context.DetachLink(link.Source, link.SourceProperty, link.Target); 
    } 
} 
Смежные вопросы