Test Access Python Postgresql
Salut à tous,
Avez-vous déjà essayé de compter le nombre d'insertion que PostgreSQL est apte à recevoir à la seconde?
Pour ma part j'ai essayé avec Access et Python.
J'ai crée une petite boucle qui va insérer 10000 fois mon nom dans un champ de table.
Certes mon pc serveur n'est pas fortiche mais cela me permet de comparer les applications clientes.
Mon serveur est équipé d'un sempron 2400 et de 512mo de ram. A noter que le disque dur est un disque de portable qui tourne à 4200trs/min (bref c pas le top)
Mon réseau est constitué d'un routeur Netgear DG834G
Voici le script en ADO( sous access)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| Function testrapide()
Dim cnx As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim chaine As String
chaine = "DRIVER={PostgreSQL ANSI};SERVER=u10791;port=5432;DATABASE=invest3;" _
& " UID=postgres;PWD=blabla;A0=0;A1=6.4;A2=0;A3=0;A4=0;A5=0;A6=;A7=100;A8=4096;A9=0;" _
& "B0=254;B1=8190;B2=0;B3=0;B4=1;B5=1;B6=0;B7=1;B8=0;B9=1;" & "C0=0;C1=0;C2=dd_"
cnx.ConnectionString = chaine
cnx.Open
cmd.ActiveConnection = cnx.ConnectionString
'définition de la requete
Dim req As String
req = "insert into commandes.""CONNECTION"" (nom) values ('JNO');commit"
'définition des variable de temps
Dim depart As Date
Dim fin As Date
cmd.CommandText = req
'enregistrement de l'heure de départ
depart = Now()
' séquence d'insertion des 10000
For i = 1 To 10000
Set rs = cmd.Execute
Next
'enregistrement de l'heure de fin
fin = Now()
MsgBox depart & " " & fin
cnx.Close
Set cnx = Nothing
Set cmd = Nothing
Set rs = Nothing
End Function |
Voici le script par odbc (j'utilise une requête programmée sous Access que je commande en VBA)Function rapide2()
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Dim depart As Date
Dim fin As Date
'enregistrement de l'heure de départ
depart = Now()
' séquence d'insertion des 10000
DoCmd.SetWarnings False
For i = 1 To 10000
DoCmd.OpenQuery ("req")
Next
DoCmd.SetWarnings True
'enregistrement de l'heure de fin
fin = Now()
Debug.Print depart, " ", fin
End Function |
Voici le script en python
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # -*- coding: cp1252 -*-
import psycopg2
import datetime
db = psycopg2.connect("dbname='invest3' user='postgres' password='blabla' host='u10791' port='5432'")
cursor = db.cursor()
req= "insert into commandes."'"CONNECTION"'" (nom) values ('JNO');commit"
a=1
b=datetime.datetime.now()
while a<=10000:
cursor.execute(req)
a=a+1
c=datetime.datetime.now()
print b," ",c |
A noter que j'ai fait un test aussi en convertissant le fichier access mdb en mde (code compilé);voici les résultats:
secondes Moyenne Enr/s
ODBC 95 105
ADO(mdb) 47 212
ADO(mde) 47 212
Python 46 217
Python compilé en exe 46 217
Conclusion: :cry:
Mon serveur est minable
La faute n'est pas à Postgresql du moins je ne pense pas!
J'ai testé en otant le réseau, c'est-à-dire en mettant les applications sur le pc serveur. Je gagne quelques secondes mais c'est pas extraordinaire.
Je m'attendais à ce que Python fasse bcp mieux qu'access, en fait c'est identique.
Autre chose, s'il faut éviter un mode de transfert de données, c'est bien ODBC. Certes la facilité est là mais bon…
Quelqu'un a-t-il déjà essayé ce test?
Quelle config faut-il pour passer à 1000 enregistrements par seconde?
Quelles sont les limites de Postgresql? Ne dépend-il que du matériel qui le supporte?
Merci pour vos commentaires.