Memory leak when calling certain python packages from Julia via PythonCall
Les mainteneurs répondent en général sous 2 jours
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 45/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Calme
- Domaine
- performance
Piste de recherche
Commencez par exécuter le MWE fourni de PythonCall et matplotlib avec les versions indiquées de Julia, Python et des packages, puis comparez son comportement mémoire avec la boucle numpy. Cherchez pourquoi la fermeture et la suppression de la figure et des axes ne libèrent pas la mémoire ; le travail sera considéré comme terminé lorsque la boucle répétée ne croîtra plus indéfiniment et que le comportement sera vérifié dans la REPL et dans le script en ligne de commande.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Affects: PythonCall
Describe the bug
Memory is not released when repeatedly creating and closing matplotlib figures via PythonCall. I originally had the issue with an elaborate cartopy plotting loop, but have managed to recreate it in a simple while true loop MWE. Each iteration allocates a new figure/axes via plt.subplots, immediately closes it with plt.close, calls PythonCall.pydel! on both the figure and axes objects, and calls GC.gc(). However, there is still a leak until the process is killed.
This does not occur when repeatedly allocating and deleting a numpy array in an equivalent loop, so the issue has something to do with what kind of python objects are created. I also have similar memory leak issues with scikit-learn.
The issue is reproducable both in the Julia REPL and in the VS Code Julia extension, and when I execute a script containing the below code from the command line.
MWE:
using PythonCall
@py import matplotlib.pyplot as plt
i = 0
while true
global i += 1
fig, ax = plt.subplots(1, 1)
plt.close(fig)
PythonCall.pydel!(ax)
PythonCall.pydel!(fig)
GC.gc()
println("Iteration $i done")
end
My system
OS: macOS 15.7.4 (arm64, Apple Silicon)
Julia: 1.12.6
Python: 3.14.2 (conda-forge, Clang 20.1.8)
PythonCall: 0.9.31
matplotlib: 3.10.8
Thanks for your help!
- Langage dominant
- Julia
- Étoiles
- 1.1k
- Forks
- 89
- Merge moyen
- 3 j 2 h
- PR mergées (30 j)
- 6
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de JuliaPy/PythonCall.jl
-
Difficulté 3/5 1-2 jours Accessibilité débutants 55/100
JuliaPy/PythonCall.jl#828 · 7 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
JuliaPy/PythonCall.jl#809 · 2 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
Locking julia dependenciesOuverteenhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
JuliaPy/PythonCall.jl#805 · 4 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
enhancement
Difficulté 3/5 1-2 jours Accessibilité débutants 68/100
JuliaPy/PythonCall.jl#796 ·
Les mainteneurs répondent en général sous 2 jours
-
enhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
JuliaPy/PythonCall.jl#790 ·
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de JuliaPy/PythonCall.jl
Issues similaires
-
Chains resumed from `initial_state` take `num_warmup + 1` warm-up stepsPeut-être pris @thevolatilebit l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 80/100
TuringLang/AbstractMCMC.jl#220 ·
-
found-by-agent
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
exanauts/SparseDirectSolver.jl#92 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 90/100
NumericalEarth/Breeze.jl#1051 ·
Les mainteneurs répondent en général sous 1 jour
-
lu_instance/qr_instance run a full factorization for FixedSizeArraysPeut-être pris @devmotion l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
JuliaArrays/ArrayInterface.jl#510 ·