[PYTHON] J'étais accro au multitraitement + psycopg2

Ce que je voulais faire

Je voulais paralléliser le processus d'exécution de pd.read_sql plusieurs fois avec multiprocessing.

Versions

Name Version
python 3.7.3
pandas 0.24.2
numpy 1.16.2
psycopg2-binary 2.8.4
PostgreSQL 11.5

Exemple de réussite (version non parallèle)

code

import multiprocessing
import pandas as pd
import numpy as np
import psycopg2

def get_connection():
	connection = psycopg2.connect(
						host='hostname',
						user='username',
						database='databasename',
						password='password')
	return connection

def function():
	for fuga in hoge:

		# fuga, pd.read_sql(sql='SELECT yyy...', con=conn)Certains traitements, y compris

	return

if __name__ == '__main__':
	with get_connection() as conn:
		hoge = np.ravel(pd.read_sql(sql='SELECT xxx...', con=conn).to_numpy())

		function

Exemple d'échec

Lorsque j'ai réécrit le bas du code dans l'exemple de réussite ci-dessus avec multiprocessing et modifié function () afin que les variables puissent être mangées en conséquence, une erreur a été générée.

code

def function(i):
	fuga = hoge[i]

	# fuga, pd.read_sql(sql='SELECT yyy...', con=conn)Certains traitements, y compris

	return

if __name__ == '__main__':
	with get_connection() as conn:
		hoge = np.ravel(pd.read_sql(sql='SELECT xxx...', con=conn).to_numpy())

		with multiprocessing.Pool(processes=64) as pool:
			for _ in pool.imap_unordered(function, range(len(hoge))):
				pass

Extrait d'erreur

multiprocessing.pool.RemoteTraceback:

#Omission

psycopg2.OperationalError: lost synchronization with server: got message type

#Omission

psycopg2.InterfaceError: connection already closed

#Omission

pandas.io.sql.DatabaseError: Execution failed on sql: SELECT yyy...
lost synchronization with server: got message type
unable to rollback

#Omission

Succès

Dans le code de l'exemple d'échec ci-dessus, cela pourrait être évité en écrivant les informations de connexion dans function ().

code

def function(i):
	with get_connection() as conn:
		fuga = hoge[i]

		# fuga, pd.read_sql(sql='SELECT yyy...', con=conn)Certains traitements, y compris

	return

Mise en garde

L'erreur suivante se produira en fonction du nombre de parallèles et du contenu de traitement de function (), mais elle peut être évitée en définissant ʻexport OMP_NUM_THREADS = 1`.

OMP: Error #34: System unable to allocate necessary resources for OMP thread:
OMP: System error #11: Resource temporarily unavailable
OMP: Hint Try decreasing the value of OMP_NUM_THREADS.

Recommended Posts

J'étais accro au multitraitement + psycopg2
J'étais accro à Flask sur dotCloud
Ce que j'étais accro à Python autorun
[Introduction à json] Non, j'en étais accro. .. .. ♬
J'étais accro au grattage avec Selenium (+ Python) en 2020
Une histoire à laquelle j'étais accro chez np.where
J'étais accro à essayer logging.getLogger avec Flask 1.1.x
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
Le record auquel j'étais accro en mettant MeCab dans Heroku
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
Une note à laquelle j'étais accro lors de l'émission d'un bip sous Linux
Notez que j'étais accro à l'interpolation des valeurs manquantes de sklearn (Imputer)
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
Deux choses dont j'étais accro à la construction de Django + Apache + Nginx sous Windows
J'étais accro à l'exécution de tensorflow sur GPU avec le pilote NVIDIA 440 + CUDA 10.2
Une histoire à laquelle j'étais accro à essayer d'installer LightFM sur Amazon Linux
J'étais accro à la création d'un environnement Python venv avec VS Code
Une histoire à laquelle j'étais accro à essayer d'obtenir une URL de vidéo avec tweepy
J'étais accro à ne pas pouvoir utiliser Markdown pour la description longue de pypi
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
J'étais accro à essayer Cython avec PyCharm, alors prenez note
Python: j'ai pu récurer en lambda
Ce à quoi j'étais accro lors de la création d'applications Web dans un environnement Windows
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
Docker x Visualization ne fonctionnait pas et j'en étais accro, alors je l'ai résumé!
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Notez que j'étais accro à la configuration de TensowFlow
J'étais sobrement accro à appeler awscli à partir d'un script Python 2.7 enregistré dans crontab
Notez que j'étais accro au script npm ne passant pas dans l'environnement de vérification
J'ai commencé à analyser
Ce à quoi j'étais accro en combinant l'héritage de classe et l'héritage de table commune dans SQLAlchemy
J'ai essayé de déboguer.
AttributeError: J'étais accro à l'objet'module 'qui n'a pas d'attribut'MyTestCase'
Python: peut être répété en lambda
Quand j'ai essayé d'installer PIL et matplotlib dans un environnement virtualenv, j'en étais accro.
Ce à quoi j'étais accro en traitant d'énormes fichiers dans un environnement Linux 32 bits
Mémo (mars 2020) auquel j'étais accro lors de l'installation d'Arch Linux sur MacBook Air 11'Early 2015
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
J'ai pu implémenter l'authentification d'application Web avec flask-login
Le livre de PyTorch était difficile à comprendre, alors je l'ai complété
J'étais un peu accro à l'installation de Python3.3 + mod_wsgi3.4 sur Sakura VPS (CentOS), donc une note de révision
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
J'étais accro au déploiement de GoogleCloudFunctions (le codec 'ascii' ne peut pas encoder le caractère u '\ u281b' en position 58 apparaît)
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
J'ai essayé d'apprendre PredNet
J'ai essayé d'organiser SVM.
J'ai parlé à Raspberry Pi
Notez que j'étais accro à accéder à la base de données avec mysql.connector de Python en utilisant une application Web
J'ai essayé d'implémenter PCANet
Introduction à l'optimisation non linéaire (I)
J'ai essayé de réintroduire Linux
J'ai essayé de présenter Pylint