Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Memory leak with pyplot

Ouverte
#1,019 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
julia, python
Domaine
tooling

Piste de recherche

Commencez avec le MWE Julia fourni et les appels PyCall à pyplot, en comparant l’utilisation de la mémoire avec et sans création de graphiques et collecte des déchets. Suivez les objets fig et plot renvoyés à travers PyCall ; le travail est terminé lorsque les références conservées sont identifiées et corrigées, de sorte que le tracé répété ne provoque plus de croissance illimitée de la mémoire.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

When I create matplotlib.pyplot plots, the memory keeps increasing and is not released by the garbage collector. The following is the case I'm interested in (with subplots) and bellow I include a more basic MWE.

Example with subplots
using PyCall
plt = pyimport("matplotlib.pyplot")

function test_pyplot()
    for i in 1:10000
        @info i
        z = rand(4, 50)
        ẑ = rand(4, 50)
        fig, axs = plot_pyplot(z, ẑ)
    end
end

function plot_pyplot(z, ẑ)
    # plt = pyimport("matplotlib.pyplot")
    N = Int(size(z, 1)/2)
    fig, axs = plt.subplots(2, N)
    for i in 1:N
        axs[1,i].plot(z[i,:], label = "true")
        axs[1,i].plot(ẑ[i,:], label = "model")

        axs[2,i].plot(z[i+N,:], label = "true")
        axs[2,i].plot(ẑ[i+N,:], label = "predicted")

        axs[2,i].set_xlabel("time steps")
        axs[i].grid(true)
        axs[i+N].grid(true)

        axs[i+N].label_outer()
        axs[i].label_outer()
    end
    # plt.close()
    return fig, axs
end

test_pyplot()

I tried defining plt and closing it inside the plot_pyplot function (commented lines) but it doesn't solve the memory leak.

Here you have a simpler MWE:

using PyCall
plt = pyimport("matplotlib.pyplot")

plot_pyplot(z) = plt.plot(z)

function test_pyplot()
    for i in 1:1000000
        @info i
        z = rand(50)
        fig = plot_pyplot(z)
    end
end
Version info and status
julia> versioninfo()
Julia Version 1.8.2
Commit 36034abf260 (2022-09-29 15:21 UTC)
Platform Info:
  OS: macOS (arm64-apple-darwin21.3.0)
  CPU: 8 × Apple M1 Pro
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-13.0.1 (ORCJIT, apple-m1)
  Threads: 1 on 6 virtual cores
(memory_leak) pkg> st
Status `~/Documents/issues/memory_leak/Project.toml`
  [438e738f] PyCall v1.94.1

I need to use pyplot directly from PyCall.jl and not through PyPlot.jl because I need to pass the fig object to Wandb.jl. Actually, maybe I could get that object from PyPlot.jl, I didn't try that yet. But since I found the bug here, I think it can be helpful to report it anyway.

Langage dominant
Julia
Étoiles
1.5k
Forks
186
Métriques de merge des PR
Aucune PR mergée en 30 j

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

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de JuliaPy/PyCall.jl

Toutes les issues de JuliaPy/PyCall.jl

Issues similaires

Plus d'issues Julia

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.