Ce que j'ai fait pour économiser la mémoire Python

Contexte

Lancer plusieurs processus qui prennent plusieurs jours sur un petit serveur avec 4 CPU et 4 G Lorsque je calculais avec 100% CPU x 4, j'ai manqué de mémoire en quelques heures. L'utilisation du processeur a fortement chuté. Apparemment, je manquais de mémoire.

Que se passait-il

Augmentation du temps de traitement Nitomonai, augmentation de l'utilisation de la mémoire de processus → Épuisement de la mémoire → Un échange de mémoire se produit → La vitesse d'accès à la mémoire se détériore considérablement → La mémoire en attente d'utilisation du processeur est de 1% ou moins → Ça ne s'arrête jamais (dégradation significative des performances)

Mesure 0. Résolu avec de l'argent

Dans la plupart des cas, augmenter le nombre de serveurs ou améliorer les performances des serveurs résoudra le problème. Je ne l'ai pas sélectionné car c'était un PJ personnel, mais quand je suis passé à un serveur avec une mémoire d'environ 32G Je me demande si c'était la seule solution.

Contre-mesure 1. Division verticale du traitement

La gestion de la mémoire de python est entièrement automatique, la laissant à la VM de base. La seule solution à la fuite de mémoire est de tuer le processus Nous avons divisé les parties qui traitaient 8 types de catégories avec une commande, donnant l'égalité de traitement.

Avant amélioration

class Category(Enum):
    A = 1
    B = 2
    C = 3

for category in Category:
  benchmark(category)

Après amélioration

category = manage.get_category_by_priority()
benchmark(category)

Contre-mesure 2. Superviseur introduit

Le code d'amélioration 1 devait être exécuté en 8 étapes, donc si le processus s'arrêtait Il a fallu recommencer. Il est pratique d'utiliser le superviseur dans un tel cas

shell


easy_install supervisor
echo_supervisord_conf > /etc/supervisord.conf
supervisord
supervisord status
alias sc='supervisorctl'
sc restart
sc reread
sc stop all
sc status
sc restart all

Contre-mesure 3. J'ai mis la main sur le GC manuel

Je ne suis pas familier avec le GC de python, il peut donc avoir des effets secondaires. Jusqu'à présent, la fuite de mémoire a été résolue et elle est stable. Il y a une possibilité de magie noire, donc je ne peux pas le recommander beaucoup.

Si vous utilisez beaucoup de cache de classe, des fuites de mémoire se produisent fréquemment dans la série python2. Python3 résoudra-t-il le problème de l'augmentation constante de la consommation de mémoire?

class Category(Enum):
    A = 1
    B = 2
    C = 3

for category in Category:
  benchmark(category)

def benchmark(category):
  bulk = []
  tmp_data = Tmp.get_all()
  for _tmp in tmp_data:
    bulk.append(calc(_tmp))
  DBTable.bulk_create(bulk)  #Masse!

  #Libération de la mémoire
  import gc
  del tmp_data
  del bulk
  gc.collect()

Référence: gc - Interface du garbage collector http://docs.python.jp/2/library/gc.html

Recommended Posts

Ce que j'ai fait pour économiser la mémoire Python
Ce que j'ai fait lors de la mise à jour de Python 2.6 vers 2.7
Ce que j'ai fait pour accueillir le Python2 EOL en toute confiance
Ce que j'ai fait avec les tableaux Python
Ce que j'étais accro à Python autorun
Ce que j'ai fait quand je voulais rendre Python plus rapide -Édition Numba-
[Chez Coder] Ce que j'ai fait pour atteindre le rang vert en Python
Ce que j'ai fait pour établir une connexion SSH à l'environnement VPS Ubuntu
Ce que j'ai appris en Python
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
Ce que j'ai fait pour accélérer la tâche de recherche de chaînes
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
J'ai essayé de toucher Python (installation)
H29.2.27 ~ 3.5 Résumé de ce que j'ai fait
Je veux déboguer avec Python
N'a pas changé de Python 2 à 3
Ce que j'ai fait pour générer les journaux d'application dans l'environnement flexible GAE.
Notez ce que vous avez fait pour utiliser Flycheck avec Python
Ce à quoi j'étais accro en présentant ALE à Vim pour Python
Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
J'ai essayé de résumer la gestion des exceptions Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
J'ai fait Othello pour enseigner Python3 aux enfants (4)
J'ai installé Python 3.5.1 pour étudier l'apprentissage automatique
J'ai fait Othello pour enseigner Python3 aux enfants (2)
J'ai essayé d'implémenter PLSA dans Python 2
Je veux utiliser jar de python
Je voulais résoudre ABC160 avec Python
Je veux créer un environnement Python
Fonction pour enregistrer les images par date [python3]
Je veux analyser les journaux avec Python
J'ai fait Othello pour enseigner Python3 aux enfants (5)
J'ai essayé d'implémenter ADALINE en Python
Ce que j'ai obtenu de Python Boot Camp
Je voulais résoudre ABC159 avec Python
J'ai essayé d'implémenter PPO en Python
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai suivi une formation à l'analyse de données Python à distance
J'ai essayé de toucher Python (syntaxe de base)
J'ai fait Othello pour enseigner Python3 aux enfants (3)
Je voulais résoudre ABC172 avec Python
Ce que j'ai fait pour garder une trace de l'humidité et de la température des archives
Après tout, que dois-je utiliser pour faire des comparaisons de types en Python?
Qu'est-ce qu'un algorithme? Introduction à l'algorithme de recherche] ~ Python ~
Mis à jour vers Python 2.7.9
Je veux faire le test de Dunnett en Python
Je voulais résoudre NOMURA Contest 2020 avec Python
Je veux mémoriser, y compris les arguments de mots clés de Python
Python: j'ai pu récurer en lambda
J'ai essayé de sauvegarder les données avec discorde
Je veux créer une fenêtre avec Python
Comment implémenter la mémoire partagée en Python (mmap.mmap)
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
J'ai commencé Python
Je veux faire un jeu avec Python
J'ai essayé Python! ] Diplômé aujourd'hui de "Tout le monde Python! Qu'est-ce que Python!"!
J'ai essayé d'expliquer à quoi sert le générateur Python aussi facilement que possible.
Je voulais installer Python 3.4.3 avec Homebrew + pyenv
J'ai écrit "Introduction à la vérification des effets" en Python