Утечки памяти в [закрытой].NET

Если вы пришли сюда, чтобы выбрать строки из фрейма данных, включив те, чье значение столбца НЕ является ни одним из списка значений, вот как перевернуть ответ unutbu для списка значений выше:

df.loc[~df['column_name'].isin(some_values)]

(Чтобы не включать одно значение, конечно, вы просто используете обычный оператор не равно, !=.)

Пример:

import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split()})
print(df)

дает нам

     A      B
0  foo    one
1  bar    one
2  foo    two
3  bar  three
4  foo    two
5  bar    two
6  foo    one
7  foo  three    

Подмножество только для тех строк, которые ARE NOT one или three в столбце B:

df.loc[~df['B'].isin(['one', 'three'])]

дает

     A    B
2  foo  two
4  foo  two
5  bar  two
20
задан 5 revs, 3 users 49% 5 January 2012 в 23:35
поделиться

14 ответов

Заблокируйте поток финализатора. Никакие другие объекты не будут собраны "мусор", пока поток финализатора не разблокируется. Таким образом используемый объем памяти вырастет и вырастет.

Дополнительные материалы для чтения: http://dotnetdebug.net/2005/06/22/blocked-finalizer-thread/

5
ответ дан 29 November 2019 в 22:41
поделиться

Заведенные в тупик потоки никогда не будут выпускать корни. Очевидно, Вы могли утверждать, что мертвая блокировка представляет большую проблему.

А зашел в тупик, поток финализатора предотвратит все остающиеся финализаторы, чтобы выполнить и таким образом препятствовать всем finalizable объектам быть исправленным (поскольку они все еще базируются freachable списком).

На много машине ЦП Вы могли создать finalizable объекты быстрее, чем поток финализатора мог выполнить финализаторы. Пока это поддержано, Вы "пропустите" память. Это, вероятно, не очень вероятно, что это произойдет в дикой природе, но легко воспроизвести.

"куча" для больших объектов не уплотнена, таким образом, Вы могли пропустить память посредством фрагментации.

существует много объектов, которые должны быть освобождены вручную. Например, объекты ремоутинга без арендного договора и блоков (должен разгрузить AppDomain).

0
ответ дан 29 November 2019 в 22:41
поделиться

Много вещей, которые могут вызвать утечки памяти на неуправляемых языках, может все еще вызвать утечки памяти на управляемых языках. Например, плохие политики кэширования могут привести к утечкам памяти.

, Но поскольку Greg и Danny сказали, нет никакого всестороннего списка. Что-либо, что может привести к содержанию памяти после ее полезного времени жизни, может вызвать утечку.

0
ответ дан 29 November 2019 в 22:41
поделиться

Вы говорите о неожиданном использовании памяти или фактических утечках? Эти два случая, которые Вы перечислили, не являются точно утечками; они - случаи, где объекты слоняются поблизости дольше, чем предназначенный.

, Другими словами, они - ссылки человек, который называет их, утечки памяти не знали или забыли о.

Редактирование: Или они - фактические ошибки в сборщике "мусора" или неуправляемом коде.

Редактирование 2: Другой способ думать об этом состоит в том, чтобы всегда удостоверяться, что внешние ссылки на Ваши объекты выпущены соответственно. Внешний означает код за пределами Вашего управления. Любой случай, где это происходит, является случаем, где можно "пропустить" память.

2
ответ дан 29 November 2019 в 22:41
поделиться

Исключения в Завершают (или Расположите вызовы от Финализатора), методы, которые препятствуют тому, чтобы неуправляемые ресурсы были правильно расположены. Общий происходит из-за программиста принятие , какие объекты порядка будут расположены и пытающийся выпустить объекты однорангового узла, которые были уже расположены, приведя к исключению, и остальная часть Завершения/Расположения от Завершают метод, не будучи названным.

4
ответ дан 29 November 2019 в 22:41
поделиться

Это действительно не вызывает утечки, это просто делает больше работы для GC:

// slows GC
Label label = new Label();  
this.Controls.Add(label);  
this.Controls.Remove(label);  

// better  
Label label = new Label();  
this.Controls.Add(label);  
this.Controls.Remove(label);  
label.Dispose();

// best
using( Label label = new Label() )
{ 
    this.Controls.Add(label);  
    this.Controls.Remove(label);  
}

Разбрасывающие доступные компоненты, лежащие как это, никогда не являются большой частью проблемы в управляемой среде как .NET - это - большая часть того, что управляло средствами.

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

21
ответ дан 29 November 2019 в 22:41
поделиться

Установка GridControl. Свойство DataSource непосредственно, не используя экземпляр класса BindingSource ( http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx ).

Это вызвало утечки в моем приложении, которое взяло меня долгое время для разыскивания с профилировщиком, в конечном счете я нашел этот отчет об ошибках, на который ответила Microsoft: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=92260

Это забавно, что в документации для класса BindingSource попытка Microsoft исчезнуть это как legitmate хорошо продумало класс, но я думаю, что они просто создали его для решения фундаментальной утечки относительно менеджеров по валюте и обязательных данных к средствам управления сеткой.

Не упускают этого, я держал пари, что существуют абсолютно загрузки текучих приложений там из-за этого!

14
ответ дан 29 November 2019 в 22:41
поделиться

Нет никакого способа предоставить всесторонний список... это похоже на очень выяснение, "Как можно промокнуть?"

Тем не менее удостоверяются, что Вы звоните, Располагают () на всем, что реализует IDisposable, и удостоверьтесь, что Вы реализуете IDisposable на любых типах, которые используют неуправляемые ресурсы любого вида.

Время от времени, выполняет что-то как FxCop на Вашей кодовой базе, чтобы помочь Вам осуществить то правило - Вы были бы удивлены, как глубоко некоторые доступные объекты прокладываются под землей в среде разработки приложения.

14
ответ дан 29 November 2019 в 22:41
поделиться

Вызов IDisposable каждый раз является самым легким местом для запуска, и определенно эффективный способ захватить все низко зависающие фрукты утечки памяти в кодовой базе. Однако это не всегда достаточно. Например, также важно понять, как и когда управляемый код сгенерирован во времени выполнения, и что, после того как блоки загружаются в домен приложения, они никогда не разгружаются, который может увеличить место приложения.

2
ответ дан 29 November 2019 в 22:41
поделиться
  1. Сохранение ссылок на объекты, которые вам больше не нужны.

Другие комментарии - один из способов гарантировать, что Dispose вызывается, - это использовать using ... когда это позволяет структура кода.

1
ответ дан 29 November 2019 в 22:41
поделиться

Для предотвращения утечек памяти .NET:

1) Используйте конструкцию using (или конструкцию try-finally) всякий раз, когда создается объект с интерфейсом IDisposable.

2) Сделайте классы «IDisposable», если они создают поток или добавляют объект в статическую или долгоживущую коллекцию. Помните, что «событие» C # - это коллекция.

Вот небольшая статья о Советы по предотвращению утечек памяти .

2
ответ дан 29 November 2019 в 22:41
поделиться

Одна вещь, которая была для меня действительно неожиданной:

Region oldClip = graphics.Clip;
using (Region newClip = new Region(...))
{
    graphics.Clip = newClip;
    // draw something
    graphics.Clip = oldClip;
}

Где утечка памяти? Правильно, вы тоже должны были избавиться от oldClip ! Поскольку Graphics.Clip - одно из редких свойств, которое возвращает новый одноразовый объект каждый раз, когда вызывается геттер.

1
ответ дан 29 November 2019 в 22:41
поделиться

Тесс Фернандес В блоге есть отличные сообщения о поиске и устранении утечек памяти. Лаборатория 6 Лаборатория 7

1
ответ дан 29 November 2019 в 22:41
поделиться

У меня есть 4 дополнительных пункта, чтобы добавить к этому обсуждению:

  1. Завершение потоков (Thread.Abort()), которые создали UI Controls без надлежащей подготовки к такому событию, может привести к ожидаемому использованию памяти.

  2. Доступ к неуправляемым ресурсам через Pinvoke и их неочистка может привести к утечке памяти.

  3. Изменение больших строковых объектов. Это не обязательно утечка памяти, так как, выйдя за пределы области видимости, GC позаботится об этом, однако, с точки зрения производительности, ваша система может пострадать, если большие строки часто модифицируются, так как вы не можете действительно полагаться на GC, чтобы обеспечить минимальный отпечаток вашей программы.

  4. Частое создание объектов GDI для выполнения пользовательской отрисовки. Если работа с GDI выполняется часто, повторно используйте один объект gdi.

3
ответ дан 29 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: