Как я могу освободить память, выделенную внешними вызовами C в Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу освободить память, выделенную внешними вызовами C в Python?

Сообщение Anonymous »

TlDr: мой код Python выполняет вызовы внешней библиотеки C. Внутренне сценарии Python используют несколько сотен МБ ОЗУ, но внешние вызовы C используют много ГБ, даже когда мне больше не нужны данные, которые они вывели. Я хотел бы знать, как освободить эту память в Python - я не до конца понимаю, как работает память Python, поскольку все представляет собой какую-то виртуальную переменную, и gc.collect() здесь, возможно, ничего не делает, поскольку память была создана Библиотека C, а не код Python.

Недавно я заметил свой проект, который на данный момент разрабатывается исключительно на Python 3.12 и основан на верхняя часть Sagemath — использует абсурдный объем памяти и отлаживала его с помощью Tracemalloc и библиотеки ресурсов, как указано здесь. Ничего особенного, я более или менее скопировал функции отображения из этого ответа в свой собственный код.
Я заметил, что Tracemalloc думает, что я использую порядка 300 МБ ОЗУ, тогда как ресурс .getrusage думает, что я использую 2300 МБ ОЗУ. Диспетчер задач показывает раздутую цифру в 6 ГБ, хотя я уверен, что это в основном связано с тем, что я работаю поверх виртуальной машины WSL. Я почти уверен, что расхождение в 2 ГБ между resources.getrusage и Tracemalloc связано с вызовом Sagemath из внешних библиотек C, таких как libgap, во время выполнения. Я, очевидно, хочу, чтобы эти 2 ГБ памяти были освобождены, поскольку, когда я использую немного больший размер ввода, моя программа занимает около 10 ГБ ОЗУ и приводит к сбою WSL.
Код выглядит примерно так:
Код выглядит примерно так:
Код выглядит примерно так:
p>

Код: Выделить всё

for r in range(1, n):
# initialise variables, load some references
# import tracemalloc, resource, define a function to display memory usage
G = self.groups[r]

tracemalloc.start()

for N, word in enumerate(huge_data_set):
if N % threshold == 0:
display_memory_usage()

# do some stuff
generators = ...

stab = frozenset(G.subgroup(generators))
self.stabiliser_lookup.update({(word, otherdata) : (stab, moredata)})

# do similar things, occasionally calling Sage group creation
# or group element creation functions

perm_indices = ...
self.permutation_lookup.update({(word, otherdata) : G(perm_indices)})

# all of this is inside more nested for loops, omitted for readability
Tracemalloc указывает, что мой собственный, «личный» код Python использует очень мало памяти. В примере, где программа в целом использовала 2,3 ГБ, было заявлено, что максимальное использование в строках в /home/user/main.py составляло 30 МБ. Самым большим нарушителем был /sage/perm_gps/permgroup.py, который якобы использовал 80 МБ, но это все равно ничто по сравнению с 2,3 ГБ. Я могу только заключить, что Tracemalloc не обнаруживает использование памяти внешней библиотеки C. Однако обратите внимание, что я не беру групповой объект G.subgroup(generators), нет: я включаю его в набор Python, желая получить только неизменяемый список элементов, элементы, которые могут быть идентифицированы с элементами предварительно вычисленного атрибута self.groups, и поэтому любое дополнительное раздувание, вызванное GAP, наверняка не будет излишним. Все нужные мне данные явно указаны в моем скрипте Python, а строка stab = Frozenset(G.subgroup(generators)), как сообщается, использует жалкие 17 МБ ОЗУ.
< em>Как я могу освободить эти лишние 2Гб?
В идеале должен быть какой-то способ, при котором замороженный набор заменяется чем-то, что окончательно кэширует память и освобождает все остальные ссылки на эту переменную, но я не знал, как это сделать. Я понимаю, что Frostedset, вероятно, мало что делает, потому что, как бы там ни было, все виртуально (моё невежество должно быть очевидным, отсюда и вопрос).

Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • C освободить всю выделенную память одним вызовом free()
    Anonymous » » в форуме Linux
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Как освободить память, выделенную opencv CV2
    Anonymous » » в форуме Python
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Как освободить память, выделенную opencv CV2
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Как я могу освободить память GPU NVIDIA, выделенную TensorFlow (2.17.0) в моем ноутбуке Jupyter?
    Anonymous » » в форуме Python
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Как получить выделенную память процесса?
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»