Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1532 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Traitement de gros fichiers TXT (type PHPMyAdmin)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Traitement de gros fichiers TXT (type PHPMyAdmin)

n°2001444
Alomon
Posté le 14-06-2010 à 13:23:27  profilanswer
 

Bonjour,
 
Je suis en train de développer une appli PHP dont le but est de traiter des données provenant de fichiers TXT pour les convertir en CSV. Je vous passe les détails...
 
Le problème que j'ai est que ces fichiers TXT peuvent être très gros (60Mo), et PHP sature généralement en mémoire. J'ai 512Mo de dispo sur les PC sur lesquels je travaille, et en poussant la limite de PHP à 420Mo, je traite tout juste des fichiers de 18Mo. Cela m'oblige à découper les fichiers TXT et les traiter séparément, pour ensuite regrouper les données, ce n'est pas vraiment pratique.
 
Ce que j'aimerais faire, est que je puisse sélectionner un gros fichier texte, et lorsque PHP atteint sa limite (que ce soit en temps, en mémoire ou en taille), alors il interrompt le traitement et demande d'appuyer sur un bouton pour poursuivre le traitement de la suite du fichier texte.
J'ai vu ce fonctionnement il y a peu sur PHPMyAdmin (lors d'un import de fichier contenant des requêtes), et j'ai été assez convaincu.
 
Cela dit, je ne vois pas trop comment m'y prendre pour reproduire le même système.
Avez-vous des idées là-dessus, voire une solution ? :)
 
Merci bien !
 
++

mood
Publicité
Posté le 14-06-2010 à 13:23:27  profilanswer
 

n°2001448
stealth35
Posté le 14-06-2010 à 13:32:23  profilanswer
 

hello, les données sont de quelle type dans ton fichier txt ?


Message édité par stealth35 le 14-06-2010 à 13:32:30
n°2001450
stef_dober​mann
Personne n'est parfait ...
Posté le 14-06-2010 à 13:35:16  profilanswer
 

Quand tu lit ton fichier tu utilise quel méthode  
- chargement complet du fichier en mémoire ?
- lecture par bloc ?


---------------
Tout à commencé par un rêve...
n°2001452
Alomon
Posté le 14-06-2010 à 13:37:21  profilanswer
 

Bonjour,
 
Les fichiers texte sont des exports de captures de Wireshark, un logiciel permettant de capturer le trafic sur un réseau. Par exemple :
 

Citation :


+---------+---------------+----------+
04:30:33,764,723   ETHER
|0   |01|00|5e|60|09|c9|00|03|ba|10|11|6c|08|00|45|00|00|55|6a|4f|00|00|08|11|d2|50|80|4e|0b|01|e0|e0|09|c9|da|bb|c3|5b|00|41|92|c2|0a|00|39|fb|7f|31|80|08|48|01|23|01|00|2d|7b|73|22|b1|8c|1b|01|ee|e9|54|30|d7|9f|97|fe|72|ff|8e|08|be|07|01|00|25|7b|3c|48|f1|00|08|54|b6|c7|04|60|00|a9|02|2e|9a|ff|cd|9f|


 
Il y a des milliers de ces messages dans chaque fichier texte.
Le but final étant d'établir des statistiques, je commence par créer un fichier CSV contenant les données décodées dont j'ai besoin à partir des messages du fichier texte.
 
Merci.

n°2001453
Alomon
Posté le 14-06-2010 à 13:41:16  profilanswer
 

Pardon, je n'avais pas vu le message de stef_doberman en postant...
 
Je lis par bloc, en déterminant par avant la longueur de la plus grande ligne du fichier et en utilisant cette longueur pour la lecture.
A chaque ligne lue, je remplis un array, et je finis par un fputcsv de chaque ligne de l'array.
 
++

n°2001461
stealth35
Posté le 14-06-2010 à 13:57:32  profilanswer
 

wireshark enregistre direct en csv

Message cité 1 fois
Message édité par stealth35 le 14-06-2010 à 13:57:45
n°2001468
stef_dober​mann
Personne n'est parfait ...
Posté le 14-06-2010 à 14:30:29  profilanswer
 

Donc tu stock chaque ligne en mémoire ?
si ta réponse est oui, alors arrête, tu sais ou ce trouve ton problème de RAM.
solution (ou partie) traite chaque ligne puis écrit directement dans ton fichier de destination en faisant juste une ouverture du fichier au début de ton script et la fermeture à la fin.
j'ai utilisé cette technique sur des fichiers de bonne taille (3Mo de txt) et ça tourne correctement.


---------------
Tout à commencé par un rêve...
n°2001563
Alomon
Posté le 14-06-2010 à 18:11:08  profilanswer
 

stealth35 a écrit :

wireshark enregistre direct en csv


 
Seulement les entêtes, pas les données, malheureusement :(
 

stef_dobermann a écrit :

Donc tu stock chaque ligne en mémoire ?
si ta réponse est oui, alors arrête, tu sais ou ce trouve ton problème de RAM.
solution (ou partie) traite chaque ligne puis écrit directement dans ton fichier de destination en faisant juste une ouverture du fichier au début de ton script et la fermeture à la fin.
j'ai utilisé cette technique sur des fichiers de bonne taille (3Mo de txt) et ça tourne correctement.


 
OK, je tente ça, je vous tiens au courant :)

n°2001601
stef_dober​mann
Personne n'est parfait ...
Posté le 14-06-2010 à 22:19:24  profilanswer
 

juste par curiosité, comment tu fait pour interpréter le fichier, enfin faire des stats dessus ?


---------------
Tout à commencé par un rêve...
n°2001604
Alomon
Posté le 14-06-2010 à 22:25:11  profilanswer
 

stef_dobermann a écrit :

juste par curiosité, comment tu fait pour interpréter le fichier, enfin faire des stats dessus ?


 
Après avoir créé le CSV (qui contient des données décodées, donc pas de l'héxa), je place tout dans un array et utilise majoritairement des boucles pour compter les cas qui m'intéressent en parcourant l'array. Je me demande d'ailleurs si c'est la meilleure méthode...
 
Sinon, les premiers résultats suite à ta réponse sont assez convaincants :)
Le plus long est maintenant l'export en TXT depuis Wireshark, lol...
 
Merci !
 
++

mood
Publicité
Posté le 14-06-2010 à 22:25:11  profilanswer
 

n°2001611
stef_dober​mann
Personne n'est parfait ...
Posté le 14-06-2010 à 22:53:43  profilanswer
 

ensuite pour optimiser plus tu peux aussi directement faire l'insertion en BDD sans passer par le fichier csv...
Edit : en faite ce que je voulais savoir, même après décodage, l'analyse à quel but ? les données analysé représente quoi ?
un analyse de trame ça j'ai compris mais c'est quoi la finalité ?


Message édité par stef_dobermann le 14-06-2010 à 22:56:13

---------------
Tout à commencé par un rêve...
n°2001613
Alomon
Posté le 14-06-2010 à 22:56:58  profilanswer
 

Ouep, j'y ai pensé, mais je préfère éviter tant que je suis +/- en période de tests et que la gestion du CSV seul n'est pas encore parfaite ; mais c'est certainement ce que je ferai à terme.


Message édité par Alomon le 14-06-2010 à 22:57:29
n°2001655
rufo
Pas me confondre avec Lycos!
Posté le 15-06-2010 à 09:47:07  profilanswer
 

Pour info, j'ai codé en php un programme de stats qui manipule des matrices de grosse taille (genre 3500x5000). Le stockage des matrices est effectué dans MySQL. Certains calculs aussi (du reste, faire du calcul matriciel avec MySQL, c'est assez fun :D). Par contre, à un moment, je dois calculer le produit d'une matrice par sa transposée. Là, MySQL est trop lent : je fais un export en CSV de la matrice puis de sa transposée (ça me fait 2 fichiers d'environ 300 Mo!) et j'utilise un petit exe codé en C et basé sur la lib GSL pour calculer le produit. Le résultat est un CSV qui j'importe ensuite dans MySQL. Ca prend 10 mins pour faire toutes ces opérations ;) Tout ça pour dire que quand faut manipuler de grosses données, un SGBD peut se montrer bien plus performant que php.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2001769
Alomon
Posté le 15-06-2010 à 12:13:42  profilanswer
 

OK. Vu que l'appli est certainement destinée à être développée plus profondément dans le futur, je passerai par une base MySQL ;)
 
Merci des infos !

n°2001772
stef_dober​mann
Personne n'est parfait ...
Posté le 15-06-2010 à 12:17:35  profilanswer
 

c'est cool, mais ca sert à quoi ? quel en est le but final ?
je sais que je suis lourd...


---------------
Tout à commencé par un rêve...
n°2001804
stealth35
Posté le 15-06-2010 à 13:30:48  profilanswer
 

t'a choisies quelles options au moment de ton export ?

n°2001842
Alomon
Posté le 15-06-2010 à 14:35:51  profilanswer
 

stef_dobermann a écrit :

c'est cool, mais ca sert à quoi ? quel en est le but final ?
je sais que je suis lourd...


 
Le but final est vraiment un but de statistiques, dans le but d'envisager la mise à jour d'un système à mon boulot.
 

stealth35 a écrit :

t'a choisies quelles options au moment de ton export ?


 
Il n'y a pas de réglage d'option dispo lors de l'export en CSV : le seul qui est accessible (la liste déroulante "as displayes", "all collapsed" ou "all expanded" ) n'a aucun effet sur le fichier exporté :sweat:

n°2001845
stealth35
Posté le 15-06-2010 à 14:39:50  profilanswer
 

je parlais pas du CSV mais de ton export type txt, ta regarder du coté du pdml ? ca serais plus simple de parser ;)

n°2001849
Alomon
Posté le 15-06-2010 à 14:45:31  profilanswer
 

stealth35 a écrit :

je parlais pas du CSV mais de ton export type txt, ta regarder du coté du pdml ? ca serais plus simple de parser ;)


 
En TXT, j'exporte toutes les indos de tous les paquets en héxa.
 
Si tu as des infos sur le PDML, je suis preneur, notamment sur leur traitement en PHP : j'y avais jeté un œil mais comme je ne connaissais pas et que j'avais besoin que ça fonctionne rapidement (même si l'appli était lente), je ne me suis pas plus penché dessus. Maintenant que j'ai un peu plus de temps pour la peaufiner, passer par un autre format pourrait être envisageable...

n°2001851
stealth35
Posté le 15-06-2010 à 14:49:05  profilanswer
 

la PDML c'est du XML, donc du parcourir ton arbre par paquet et tu récupère les info que tu veux

n°2001853
Alomon
Posté le 15-06-2010 à 14:53:26  profilanswer
 

stealth35 a écrit :

la PDML c'est du XML, donc du parcourir ton arbre par paquet et tu récupère les info que tu veux


 
OK, mais je n'ai jamais fait non plus de traitement de XML. N'est-ce pas plus long ? N'est-on pas obligé de tout stocker en mémoire ?

n°2001856
rufo
Pas me confondre avec Lycos!
Posté le 15-06-2010 à 14:57:04  profilanswer
 

Tiens, je connaissais pas PDML, ça a l'air pas mal du tout et assez puissant :jap:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2001858
stealth35
Posté le 15-06-2010 à 14:58:49  profilanswer
 

regarde d'hab si y'a toute les info que tu veux dedan, apres ton XML est convertis direct en Array donc tu fais ton traitement, tu peux meme direct prendre uniquement les donnée qui t'intéresse (par exemple prendre que les Ip qui se sont connectés via UDP)


Message édité par stealth35 le 15-06-2010 à 15:00:21
n°2002267
MEI
|DarthPingoo(tm)|
Posté le 16-06-2010 à 16:11:51  profilanswer
 

Alomon a écrit :


 
OK, mais je n'ai jamais fait non plus de traitement de XML. N'est-ce pas plus long ? N'est-on pas obligé de tout stocker en mémoire ?


Si t'utilise un parser SAX et pas DOM, tu peut parser un XML de 10To si tu veux sans consommer plus que quelques Ko.
 
Par contre faut interpréter les données à la volée.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°2002270
Alomon
Posté le 16-06-2010 à 16:18:37  profilanswer
 

Bonjour,
 
Désolé, mais n'ayant jamais touché au XML, me parler de "parser SAX ou DOM", c'est me parler en chinois :P

n°2002272
rufo
Pas me confondre avec Lycos!
Posté le 16-06-2010 à 16:20:17  profilanswer
 

MEI a écrit :


Si t'utilise un parser SAX et pas DOM, tu peut parser un XML de 10To si tu veux sans consommer plus que quelques Ko.
 
Par contre faut interpréter les données à la volée.


 
Il me semblait que DOM chargeait en entier le fichier xml en mémoire?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2002273
rufo
Pas me confondre avec Lycos!
Posté le 16-06-2010 à 16:21:04  profilanswer
 

Alomon a écrit :

Bonjour,
 
Désolé, mais n'ayant jamais touché au XML, me parler de "parser SAX ou DOM", c'est me parler en chinois :P


 
Google est ton ami. Ne pas savoir n'est pas un pb. Ne pas chercher à savoir quand on en a besoin, ça, c'est un pb :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Traitement de gros fichiers TXT (type PHPMyAdmin)

 

Sujets relatifs
[perl] Traitement de fichier .csvFichiers inexistants et pourtant...
ASM Gros problème :"(Renommer deux fichiers
character set et apple? probleme de nom de fichiersType de variable tableau
[Résolu] Pb de résolution de type dans un templateArborescence fichiers projet j2ee (servlets)
Gros soucis ! element modifié tout seul alors que je ne veux pas! 
Plus de sujets relatifs à : Traitement de gros fichiers TXT (type PHPMyAdmin)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR