В Python 3.8 у меня есть несколько значений общей памяти, например:
from multiprocessing.sharedctypes import RawArray, RawValue
...
sm_best_score_gpu_id = RawValue(ctypes.c_double, -1)
sm_positions = RawArray(ctypes.c_int32, genome_positions)
Это должно быть перераспределено время от времени. Если я просто повторю эти операции в цикле, будет ли эта память автоматически освобождена при сборке мусора исходных переменных?
Я просматриваю документы ctypes, но не нашел ничего, связанного с освобождением памяти.
Как я могу освободить эту память?
Все должно быть в порядке. Сборка мусора может происходить не сразу. В интерпретаторах, отличных от CPython, таких как PyPy, Jython и т. д., вся коллекция недетерминирована. В CPython («референсном» интерпретаторе, который, что вполне уместно, подсчитывает ссылки), сборка является детерминированной, когда не задействованы циклы ссылок, но если цикл ссылок формируется (что может произойти случайно в странных случаях, таких как возбуждение исключений, содержащих кадры в их трассировки), и один из этих объектов прикреплен к чему-то в цикле, он не будет очищен до тех пор, пока сам цикл не будет собран, что произойдет в неопределенное время в будущем (и может вообще не произойти, если сборщик циклов отключено с помощью gc.disable()
, или выдающиеся объекты заморожены с помощью gc.freeze()
).
До тех пор, пока «в конечном итоге очищается» нормально, и вы не мешаете циклическому сборщику мусора, очистка в конечном итоге произойдет (базовый тип использует финализатор, чтобы гарантировать освобождение памяти обратно в общую кучу, из которой она была получена ).
Приходя из мира C/C++, я беспокоился об утечке памяти. Но если его в конце концов почистить, то все в порядке. Большое спасибо!