IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[PHP 5.3] Remplissage d'une table


Sujet :

PHP & Base de données

  1. #1
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut [PHP 5.3] Remplissage d'une table
    Bonjour à tous.

    A des fins de tests de performances, j'ai écrit un script qui me permet de remplir une table MySQL (innoDB) avec des données aléatoires. Ce script prépare une requête d'insertion qui est exécutée 500.000x, or les insertions s'arrêtent au bout de 4096 lignes alors que le retour de PDOStatement::execute lui est toujours true...

    J'ai vérifié l'algorithme de génération aléatoire et il n'y a pas de redondance, la table porte un index unique sur l'intégralité de ses champs (sauf la clé) mais la probabilité de générer un triplet existant est quasi-nulle.

    Bref, je me retrouve devant un comportement que je n'ai jamais remarqué en production où il est courant de traiter des batchs de plusieurs dizaines de milliers de lignes...

    Je précise que les tests se déroulent sur un environement WAMP avec MySQL 5.1, PHP 5.3 et Apache 2.2.

    Avez-vous déjà rencontré ce problème ? D'où peut-il bien venir ?

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    montre pour voir

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je me permet de masquer certaines données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    set_time_limit(0);
    define('NUM', 500 * 1000);
     
    function generate_random_string ($maxlength = 10, $chars = "abcdefghijklmnopqrstuvwxyz0123456789") {
        $str = "";
        $c = strlen($chars) -1;
        do {
            $str .= $chars[mt_rand(0, $c)];
        } while (strlen($str) < $maxlength);
        return $str;
    }
     
    $pdo = new PDO('mysql:dbname=xxxxxxx;host=xxxxxxx', 'xxxxxxx', 'xxxxxxx');
    $stmt = $pdo->prepare('REPLACE INTO `xxxxxxx` (`xxxxxxx`,`xxxxxxx`,`xxxxxxx`) VALUES (:xxxxxxx,:xxxxxxx,:xxxxxxx)');
     
    $l = strlen((string)NUM);
    for ($i = 0; $i < NUM; $i++) {
        $p = array(
        	'xxxxxxx' => generate_random_string(15, '123456789'),
            'xxxxxxx' => '+33' . generate_random_string(9, '0123456789'),
            'xxxxxxx' => generate_random_string(16, '0123456789')
        );
        $r = $stmt->execute($p);
        echo '[' . str_pad($i +1, $l, '0', STR_PAD_LEFT) . '/' . NUM . '] > Insert ' . $p['xxxxxxx'] . ':' . $p['xxxxxxx'] . ':' . $p['xxxxxxx'] . ' ' . ($r ? 'OK' : 'NOK') . "\n";
    }
     
    echo "Done.";
    Exécuté en mode CLI.

    Allez savoir pourquoi mais maintenant ça fonctionne depuis que j'ai remplacé l'usage de rand par mt_rand...

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    t'as pas activé les erreurs pour PDO ?

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Alors, comme je l'ai mentionné, le fait de mieux générer mes phrases aléatoires m'a permi de résoudre le problème. Encore que je ne comprenne pas bien pourquoi la génération de 43 parmi 10 caractères ne permette que 4096 triplets en utilisant rand()...

    Le souci c'est que je n'avais pas de message d'erreur, le retour de $stmt->execute était bien true à chaque fois - donc je suppose que les entrées étaient simplement écrasées et que c'est la génération aléatoire qui était en cause.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    si tu veux t'as openssl_random_pseudo_bytes, mais ca marche pas très bien (assez lent sous win)

Discussions similaires

  1. [SQL] Création et remplissage d'une table pays
    Par *alexandre* dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 23/05/2007, 10h10
  2. [windev10]optimisation remplissage d'une table
    Par nath-0-0 dans le forum WinDev
    Réponses: 6
    Dernier message: 16/03/2007, 15h34
  3. Remplissage D'une Table
    Par Maria1505 dans le forum Oracle
    Réponses: 2
    Dernier message: 08/11/2006, 13h53
  4. Remplissage D'une Table
    Par Maria1505 dans le forum Oracle
    Réponses: 1
    Dernier message: 08/11/2006, 12h30
  5. [PL/SQL] Boucle de remplissage d'une table.
    Par Maglight dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/12/2005, 17h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo