LINUX.ORG.RU

вопрос про освобождение памяти в питон 3.2


0

1

питон 3.2

работает доп. поток и постепенно складывает данные в одну общую переменную в главном потоке

таким образом имеем:

self.storage['уникальный ключ'] = «данные»

после использования удаляю ключ и его данные:

del self.storage['уникальный ключ']

но память как жрал так и жрет.

Вопрос вот какой - действительно ли del удаляет элемент словаря и возвращает память операционной системе?
Как гарантированно вернуть память в ОС?

> Как гарантированно вернуть память в ОС?
Может вызвать gc.collect()?

urxvt ★★★★★
()

> действительно ли del удаляет элемент словаря и возвращает память операционной системе?

Если в словаре была единственная ссылка на объект, то освобождает. А вот в ОС может и не вернуться, ибо фрагментация.

const86 ★★★★★
()

действительно ли del удаляет элемент словаря

Да

и возвращает память операционной системе?

Нет

Тривиальный пример:

m = {"aaa": SomeObject()}
smth = m["aaa"]
del m["aaa"]

Из массива удалится, но память не освободится. Объяснять почему?

zJes ★★
()

> но память как жрал так и жрет.

Офигительно точная формулировка. Ты хочешь сказать, что размер резидентной памяти процесса не уменьшается, или что он растет?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>>Офигительно точная формулировка

да это сложно обьяснить, поэтому я хочу лишь узнать лишь про момент с удалением элемента.

я понял что ОС память обратно не получает.
Но у меня эта переменная забивается так, что сжирает все 8гб оперативки на сервере *facepalm*

при этом весь словарь убивать нельзя.

попробую вызывать gc.collect(), но если это не поможет - есть ли ещё способы?

ссылка на него одна единственная - tmp, поэтому попробую так:

tmp = list(d['element'])
del d['element']
gc.collect()


sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

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

Bad_ptr ★★★★★
()
Ответ на: комментарий от sergey-novikov

> попробую вызывать gc.collect(), но если это не поможет - есть ли ещё способы?

Попробуй втупую: self.storage['уникальный ключ'] = None

ссылка на него одна единственная

Если есть утечка, то ссылка не единственная.

tailgunner ★★★★★
()

петон не освобождает объекты в случае циклических ссылок. может, проблема в этом?

mmarkk
()
Ответ на: комментарий от mmarkk

петон не освобождает объекты в случае циклических ссылок

А мужики то и не знали:

import weakref
import gc

class A:
    pass

storage = []
storage.append(A())
storage.append(A())

storage[0].ref = storage[1]
storage[1].ref = storage[0]

ref1 = weakref.ref(storage[0])
ref2 = weakref.ref(storage[1])

# Delete refs to objects
storage[:] = []
gc.collect()

assert ref1() is None
assert ref2() is None
baverman ★★★
()
Ответ на: комментарий от baverman

блин. забыл добавить, что не убивает если есть циклические ссылки и в обоих объектах указан деструктор (__del__),

Если просто циклические - тогда убивает это да.

mmarkk
()
Ответ на: комментарий от mmarkk

Глупость сморозил, да. В этом случае отцу пролетариата помогут только слабые ссылки.

baverman ★★★
()

> действительно ли del удаляет элемент словаря

я это гарантирую.

man «программный хип»

anonymous
()
Ответ на: комментарий от const86

А вот в ОС может и не вернуться

она абсолютно точно не вернётся и я ещё не видел чтобы где-то процесс рос в обратную сторону.

ибо фрагментация.

Не поэтому. Эта фича тупо нигде не реализована. Во всяком случае я ещё не видел реализации malloc которая бы делала brk/sbrk в меньшую сторону.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

malloc не всегда делает brk. иногда mmap - в зависимости от размера блока. тогда munmap вернёт память.

Wikipedia, malloc:

For requests above the mmap threshold, the memory is always allocated using the mmap system call. The threshold is 256 KB (1 MB on ptmalloc2) by default, but can be changed by calling the mallopt function.

mmarkk
()
Ответ на: комментарий от true_admin

> Во всяком случае я ещё не видел реализации malloc которая бы делала brk/sbrk в меньшую сторону.

munmap делает, так что порой всё-таки память освобождается.

const86 ★★★★★
()
Ответ на: комментарий от Eshkin_kot

malloc_trim

Я знал что не зря сижу на лоре, нет-нет да и проскакивает интересная инфа. Спасибо большое, это может пригодится. Обидно то что в man malloc об этом ни слова.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.