Page 1 sur 1

Script bouffeur de mémoire

Posté : 16 nov. 2006, 19:47
par lemoineo
J'utilise une classe liée à MYSQL dite persistante sur laquelle je boucle pour charger les données d'un fichier (entre 5.000lignes et 20.000 lignes)
Pour MYSQL, c'est de la bibine (j'ai testé en direct via LOAD DATA)
Par contre, avec mon objet, j'atteinds des sommets (jusqu'à 500Mo !!!) sans expliquer pourquoi et c'est lent, c'est lent !!!
Bien sûr, j'ai fait sauter la limite de temps, cherché à augmenter la taille mémoire limite (64Mo) , ajouté des UNSET pour rendre la mémoire à chaque passage ou je crée une nouvelle occurence, rien n'y fait !!!

La fonction ci-dessous est appelée à chaque ligne de mon fichier (je passe sous silence la partie IMPORT ...
function AjoutPiece($Reference,$Indice,$Designation) {
	$UnePiece = new Piece($Reference);
	if ($UnePiece->Erreur <> "") {
		$Message .= $UnePiece->Erreur."<br>";
	} else {
		$UnePiece->Enregistrer();
		if ($UnePiece->Erreur <> "") {
			$Message .= $UnePiece->Erreur."<br>";
		} else {
			$UnePiece->Attribuer("Indice",$Indice);
			if ($UnePiece->Erreur <> "") $Message .= $UnePiece->Erreur."<br>";

			$UnePiece->Attribuer("Designation",$Designation);
			if ($UnePiece->Erreur <> "") $Message .= $UnePiece->Erreur."<br>";

		}
	}
unset($UnePiece);
	return $Message;
}

Posté : 16 nov. 2006, 19:51
par Cyrano
Il faudrait vérifier plusieurs choses :
- l'indexation des collones de tes tables, ça a un effet direct sur la vitesse des manipulations;
- la pertinence des requêtes : essaye de les vérifier avec EXPLAIN par exemple;
- enfin, tu nous montres des appels de méthodes, mais ça ne nous montre pas ce que ça fait par la suite : tu as mentionnée le mot "boucle" , veux-tu dire que tu fais des requêtes en boucle ?

Réponse ?

Posté : 16 nov. 2006, 20:26
par lemoineo
- Pour les index, j'ai déjà regardé , la table PIECES a l'index sur la REFERENCE qui est également l'identifiant de mon objet PIECE
- La boucle est l'appel à la fonction décrite sur chaque ligne du fichier d'entrée.
- La partie 'pdo' perso tourne mais 'ne sert' (là aussi entre guillemets) qu'à fabriquer des requetes pré-machées et des controles sur les attributs de l'objet (existance dans des listes, longueur, etc ...)
Cela serait un peu lourd d'afficher le code de l'appel ... mais au plus je fais
- un select pour identifier si la ligne existe,
- un insert s'il n'existe pas
- une ou deux updates sur les attributs

Posté : 16 nov. 2006, 20:44
par Cyrano
ça fait trois à quatre requête à chaque tour et tu fais ça pour chaque ligne ??? :shock:

oui

Posté : 16 nov. 2006, 21:26
par lemoineo
oui

Re: Script bouffeur de mémoire

Posté : 16 nov. 2006, 22:25
par @rthur
je boucle pour charger les données d'un fichier (entre 5.000lignes et 20.000 lignes)
ça fait trois à quatre requête à chaque tour et tu fais ça pour chaque ligne ??? :shock:
oui
@rthur aimerait pas être un serveur MySQL... :wink:

Posté : 16 nov. 2006, 22:54
par Cyrano
En limitant à 3 requête pour 5000 lignes, on arrive à 15000 requêtes... et à 4 pour 20000, ça fait 80000 requêtes :shock: : j'espère que tu as un serveur dédié parce que sinon, il faudra pas longtemps à l'administrateur du serveur pour te jeter dehors à grande vitesse.

Ça n'a absolument aucun sens de mettre en service une application de ce genre. Revois ta copie, c'est impossible que ce soit optimisé. :-k