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

Python Discussion :

Lire de gros fichiers de logs


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut Lire de gros fichiers de logs
    Bonjour,

    Je cherche à optimiser un script que j'ai écrit pour trier un fichier de logs, car ces fichiers font généralement plusieurs 1Oaines de Mo et du coup le traitement est long.
    J'ai tenté plusieurs méthodes pour lire le fichier (iterateurs, map), mais rien qui n'ait sensiblement changé les choses. Quelqu'un aurait une suggestion ?

    Merci à tous

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut Peut être
    mais il faudrait en dire plus.

    Quel type de données dans ces fichiers ?
    Il s'agit de trier des fichiers ou de trier leur contenu ?
    Trier en fonction de quoi ?
    Faut-il faire des décomptes ?

    Parmi les fonctions qui traitent des chaines de caractères, toutes ne sont pas équivalentes au niveau de la vitesse.
    Par exemple, si on connait la position précise de x caractères recherchés dans un string,
    if chaine[9:9+x]=='x caractères' : sera plus rapide que if chaine.count('x caractères')==1:

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut
    A partir d'un fichier initial, contenant de nombreuses lignes similaires (mais pas complètement identiques), je cherche à produire un fichier texte contenant une seule occurrence pour un type de message (une sorte de rapport sur les évènements survenus en gros). Mon script me permettrait de ne pas avoir à parcourir à la main le fichier à la recherche d'une ligne sur 10000, et de rendre le fichier de logs plus lisible en écrémant les répétitions).

    Voici une partie de mon algorithme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for line in oError:
        s = get_close_matches(line, errors, cutoff=0.1)
        if s != []:
            i = errors.index(s[0])
            if check[i] == False:
                oReport.write(s[0])
                oReport.write("\n")
                check[i] = True
        else:
            errors.append(line)
            oReport.write(line)
            oReport.write("\n")
            check.append(True)
    En gros, pour chaque ligne on recherche la similarité entre les autres. Si la ligne courante est similaire à une de celles enregistrées précédemment, on passe à la suivante, si au contraire elle ne correspond pas à quelque chose de connu, on l'enregistre dans une liste.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut Déjà, une chose
    En voyant
    for line in oError:
    je conclus que tu as dû faire quelque chose comme oError = fichier.splitlines() et que oError est donc une liste de lignes qui occupe un espace mémoire de la taille du fichier initial, plusieurs dizaines de Mo dis-tu.
    Le programme a donc affaire à un objet en mémoire (mémoire vive) de plusieurs dizaines de Mo et c'est lourd pour lui, et ça peut être d'autant plus une cause de lenteur que l'ordi est peu performant.
    J'ai été dans ce cas, j'ai rapidement compris qu'il fallait que je passe à un traitement séquentiel des mes fichiers, c'est à dire analyser les lignes les unes après les autres, sans garder une ligne une fois analysée.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut
    Je n'ai pas utilisé splitlines lors de l'ouverture mon fichier, je vais jeter un oeil de ce côté là.
    Par contre j'ai tenté la chose avec fileinput, qui apparemment lis les lignes unes par unes dans le fichier, mais ça n'a pas vraiment amélioré la chose.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut
    d'ailleurs, je me pose la question de savoir si :
    est vraiment équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for line in oError.readlines():
    Je crois que les fichiers sont "itérables", ce qui fait que j'obtient le même résultat avec les 2 lignes ci-dessus.

Discussions similaires

  1. Lire des gros fichiers
    Par alain123 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 04/09/2007, 09h16
  2. [Delphi 7] Lire un gros fichier
    Par bibi26 dans le forum Delphi
    Réponses: 5
    Dernier message: 05/03/2007, 22h30
  3. Gros fichier de logs et performance
    Par usf70 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2007, 12h46
  4. [XML]lire un gros fichier de format xml et l'envoyer
    Par diamonds dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/10/2006, 15h33
  5. Peut-on lire des gros fichiers(100k) avec "TClientSocke
    Par Fred LEM dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/12/2004, 14h41

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