Недавно я заметил свой проект, который на данный момент разрабатывается исключительно на 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
< em>Как я могу освободить эти лишние 2Гб?
В идеале должен быть какой-то способ, при котором замороженный набор заменяется чем-то, что окончательно кэширует память и освобождает все остальные ссылки на эту переменную, но я не знал, как это сделать. Я понимаю, что Frostedset, вероятно, мало что делает, потому что, как бы там ни было, все виртуально (моё невежество должно быть очевидным, отсюда и вопрос).
Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python