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 :

comparaison de codes et affectation


Sujet :

PHP & Base de données

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut comparaison de codes et affectation
    Bonjour,

    Je dispose de 2 fichiers A et B .

    - fichier A avec un id numérique + id texte . L'id texte de la table A est une ancienne valeur.

    - fichier B avec 2 id aux format texte. Dans le fichier B il y a l'ancien id qui figure dans la table A et le nouvel id qui ne figure pas dans la table A.

    Je souhaite via un code PHP récupérer un fichier de sortie avec id numérique + id ancien texte + id nouveau texte.

    Je ne souhaite pas passer par le SQL et les inner join pour la simple et bonne raison que j'ai des opérations de contrôle assez pointues à faire.

    Le fichier A est quand même assez costaux on dépasse les 5 millions de lignes. Le fichier fait de 250 à 300 mo. Le fichier B est aussi volumineux entre 50 et 75 mo (soit 1 à 2 millions de lignes).

    J'ai commencé à taper le code suivant pour contrôler divers paramètres des fichiers :

    Code php : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?php
     
    // declaration des fichiers en entrée et sortie
     
    $in1_chemin='C:\wamp\www\progs_infos_autos\ZZZ_atraiter\fic1.txt';
    $in2_chemin='C:\wamp\www\progs_infos_autos\ZZZ_atraiter\fic2.txt';
    //$out_chemin=''
     
    $in1 = fopen($in1_chemin, 'r');
    $in2 = fopen($in2_chemin, 'r');
    //$out = fopen($out_chemin, 'a+');
     
    //existence fichier ou non
     
    if (file_exists($in1)) 
    {
    	// nombre de ligne dans fichier 1
     
    	$in1_contenu_fichier = fread( $in1, filesize ( $in1_chemin ) );
    	$nombre_ligne_in1 = substr_count( $in1, "\n" );
    	echo $nombre_ligne_in1;
        echo "Le fichier $in1_chemin existe.";
    } 
    else 
    {
        echo "Le fichier $in1_chemin n'existe pas.";
    	break; 
    }
     
    if (file_exists($in2)) 
    {
    	// nombre de ligne dans fichier 2
     
    	$in2_contenu_fichier = fread( $in2, filesize ( $in2_chemin ) );
    	$nombre_ligne_in2 = substr_count( $in2, "\n" );
    	echo $nombre_ligne_in2;
        echo "Le fichier $in2_chemin existe.";
    } 
    else 
    {
        echo "Le fichier $in2_chemin n'existe pas.";
    	break; 
    }
     
    ?>

    Je me retrouve avec 2 problèmes :

    - php me dit que le fichier 2 n'existe pas alors qu'il existe . Le fichier 1 lui est bien lu .
    - un "allowed memory" . En somme les fichiers txt sont trop lourd pour php . Chose étonnante sur la machine en question j'ai déjà manipulé des fichiers csv beaucoup plus volumineux. De 500 mo sans problème avec la même version de PHP "5.5.12".

    Merci de m'aiguiller

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Bonsoir,

    file_exists prends en paramètre un chemin alors que tu lui donnes une ressource.

    Quant au problème de mémoire, si tu as lu un csv avec fgetcsv, le fichier est lu ligne par ligne. Avec fread, tu lis l'ensemble du fichier d'un seul coup, ce qui explique les problèmes de capacité. Est-ce que tu ne peux pas procéder à un traitement ligne par ligne avec fgets?

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Une solution performante pour lire ligne par ligne est de passer par les générateurs :

    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
    class File {
     
      private $file;
     
      function __construct($filename, $mode) {
        $this->file = fopen($filename, $mode);
      }
     
      function oneLine() {
        while (($line = fgets($this->file)) !== false) {
            //traitement sur $line
            // ...
     
            //Renvoi de la ligne
            yield $line;
        }
      }
    }
     
    $f = new File("fichier.txt","r");
    foreach ($f->oneLine() as $linefromfile) {
      //Faire quelque chose avec $linefromfile
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Bonjour,

    En retravaillant mes données j'ai finalement pu opté pour du sql. Pour la simple est bonne raison 2 millions x 5 millions . Ce qui fait 10 000 milliard d'opérations de comparaisons. Ce qui est tout bonnement sur réaliste .

    J'ai découpé les tables . J'ai travaillé en lot les classifications . Nickel Chrome .

    Ce code php est utile mais pour des fichiers de moindres tailles. Éventuellement un petit tableau qui en compare un gros.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/05/2010, 23h21
  2. Probleme Code Macro (Affectation variable?)
    Par Esmax666 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/06/2009, 10h23
  3. Comparaison par code ascii
    Par lazins dans le forum ASP.NET
    Réponses: 4
    Dernier message: 13/11/2008, 15h50
  4. Comparaison : même code et nom différent
    Par _stef_ffff_f34 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/04/2006, 16h21
  5. Comparaison de code dans plusieurs modules
    Par jbaudin dans le forum Access
    Réponses: 2
    Dernier message: 03/10/2005, 11h47

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