2015-12-20 2 views
1

Я создаю огромный сетчатый объект (около 900 мегабайт). Как только я закончил с анализом, я хотел бы как-то удалить его из памяти.Удалите большой объект в ironpython и мгновенно отпустите память?

Я немного искал на stackoverflow.com, и я узнал, что del удалит ссылку на упомянутую сетку. Не сам объект сетки. И что через некоторое время объект сетки в конечном итоге получит сбор мусора.

gc.collect() Единственный способ, с помощью которого я мог мгновенно освободить память, и там, чтобы как-то удалить упомянутую большую сетку из памяти? Я нашел ответы здесь, на stackoverflow.com, в которых говорится, что следует избегать gc.collect() (по крайней мере, когда речь заходит о регулярном питоне, а не о железе). Я также нашел комментарии здесь, в stackoverflow, которые утверждают, что в IronPython даже не гарантировано, что память будет выпущена, если ничего не будет содержать ссылку.

Любые комментарии по всем этим вопросам?

Я использую версию ironpython 2.7.

Благодарим вас за ответ.

ответ

2

В целом управляемые среды обмениваются памятью, если ссылка на объект больше не существует (от соединения от корня до самого объекта). Чтобы заставить .NET-инфраструктуру выпускать память, сборщик мусора - ваш единственный выбор. В общем, важно знать, что GC.Collect не освобождает память, он ищет только объекты без ссылок и помещает их в очередь объектов, которые будут выпущены. Если вы хотите освободить синхронизацию памяти, вам также понадобится GC.WaitForPendingFinalizers.

Одна вещь, чтобы знать о больших объектах в рамках .net, заключается в том, что они хранятся отдельно, в кучке больших объектов (LOH). С моей точки зрения, неплохо освободить эти объекты синхронно, вам нужно только знать, что это может вызвать некоторые проблемы с производительностью. Вот почему, в общем, GC решает сам по себе, когда собирать и освобождать память, а когда нет.

Поскольку gc.collect реализован на Python, а также в IronPython, вы сможете использовать его. Если вы посмотрите на реализацию в IronPython, gc.collect сделает именно то, что вы хотите, позвоните GC.Collect() и GC.WaitForPendingFinalizer. Поэтому в вашем случае я буду использовать его.

Надеюсь, это поможет.

+1

Благодарим вас за ответ @BendEg. Я не программист, поэтому дайте мне понять, правильно ли я вас понял: Вы советуете позвонить: '' 'del meshObject; GC.Collect() '' '. И '' '' GC.WaitForPendingFinalizer''' не следует вызывать, поскольку ironpython будет вызывать его автоматически из-за верхнего '' 'gc.collect()' '' оператора. Я правильно понял это? – marco

+1

Да, вы правильно поняли мой ответ. Если память должна быть освобождена синхронизацией и немедленно, у вас нет другого выбора, использующего сборщик мусора. – BendEg

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