Как я могу заставить сжатие 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 памяти
Это считается плохой практикой для вызова GC вручную. почему ты хочешь сделать это? Просто позвольте ему выполнять свою работу. –
Если нет перфекционной проблемы, то есть –
Да, я бы не позвонил GC.Collect - см. Эту тему http://stackoverflow.com/questions/118633/whats-so-wrong-about-using-gc-collect/ – kd7