2010-01-07 2 views
0

Как я могу заставить сжатие DataTable и/или List, чтобы эффективно освободить память? В настоящее время я удаляю обработанную строку из DataSet каждую итерацию цикла, но я не уверен, выпущена ли память.Советы по работе с большими строками с учетом использования памяти

for (int i = m_TotalNumberOfLocalRows - 1; i >= 0; i--) 
{ 
    dr = dt.Rows[i]; 
    // Do stuff 
    dt.Rows.Remove(dr); 
} 

Если это не уменьшает следы DataTable в памяти, я могу использовать Список. Я использую DataTable как хранилище для DataRows, я мог бы использовать любой механизм сбора или хранения, который был бы низким в памяти, и иметь возможность выпускать память каждые x итераций.

спасибо.



Edit: После выполнения некоторого профилирования памяти после прочтения What Are Some Good .NET Profilers? я обнаружил, что основной потребитель памяти являются строками.

Мы делаем много пользовательских выходов во время этого процесса, а потребление памяти составляет около 170 МБ-230 МБ, достигнув максимума в 300 МБ. Я использую StringBuilder с начальным размером 20971520 для хранения вывода/журнала того, что происходит, и после того, как один процент от общего количества записей был обработан. Я устанавливаю свойство Text элемента управления DevExpress MemoEdit в StringBuilder.ToString(). Я обнаружил, что этот метод быстрее, чем добавление StringBuilder.ToString() в MemoEdit.Text (очевидно, логика по отношению к StringBuilder отличается от добавления и установки MemoEdit.Text)

Я также обнаружил, что вместо того, чтобы воссоздать StringBuilder (20971520), проще в памяти и быстрее выполнить только StringBuilder.Remove(0, StringBuilder.Length)

Есть ли советы, которые вы могли бы поделиться, чтобы повысить производительность при работе с большими строками (файл журнала, который он выписал, который содержит log составляет около 12,2 МБ для около 30 000 записей)?

Примечание: Я изменил название вопроса и теги.
Старое название: Как я могу заставить сжимать DataTable и/или список для освобождения памяти?
Старые теги: список DataTable C# .net памяти

ответ

1

Попробуйте принуждать сборщик мусора проход:

GC.Collect(); 

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

GC.WaitForPendingFinalizers(); 

сразу после GC.Collect()


EDIT: Как упоминалось в комментариях ниже, широко считается плохой практикой напрямую обращаться к сборщику мусора. Тем не менее, это позволило бы достичь цели освободить неиспользуемую память удаленных строк.

+2

Это считается плохой практикой для вызова GC вручную. почему ты хочешь сделать это? Просто позвольте ему выполнять свою работу. –

+0

Если нет перфекционной проблемы, то есть –

+1

Да, я бы не позвонил GC.Collect - см. Эту тему http://stackoverflow.com/questions/118633/whats-so-wrong-about-using-gc-collect/ – kd7

0

Придерживайтесь DataTable и удаляйте ненужные строки, как в вашем примере.

Посредством этого вы не можете контролировать использование памяти: это делается сборщиком мусора CLR.

0

У вас есть явная необходимость в управлении этим напрямую? Сборщик мусора управляет этим для вас.

4

Если у вас возникли проблемы с памятью, не пытайтесь вручную освободить ее, вызвав сборщик мусора. Время выполнения будет обрабатывать его для вас, а 99% времени будет более эффективным, чем вы, пытаясь угадать, когда оптимальное время.

Что вы должны помнить, так это то, что когда вы вызываете GC.Collect(), он работает со всеми уровнями коллекции мусора и «упорядочивает» все объекты, которые необходимо освободить. Вы, скорее всего, будете тратить процессорное время и т. Д., Обрабатывая то, что не нужно делать в этот момент времени.

Если вы абсолютно в команде есть GC.Collect()

http://msdn.microsoft.com/en-us/library/xe0c2357.aspx

http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm

+0

Спасибо, Кевин. Как упоминалось в редакции в вопросе, да, у программы возникает проблема с использованием памяти. Ну, я думаю, что это проблема. – AndrewJacksonZA

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