Partage
  • Partager sur Facebook
  • Partager sur Twitter

Python Pandas SQLITE vs CSV

    17 janvier 2018 à 13:22:06

    Bonjour,

    Je suis débutant en python/pandas/SQLITE.

    Je désire faire un script en python qui tournera une fois par jour.

    Ce script va chercher chaque jour 5 fichiers csv (qui sont remplacé chaque jour), le plus gros csv atteint + - 2.000.000 de ligne  et  20 colonnes. Ensuite j'ai un certain nombre de query a faire qui me donne une database que je conserve dans une db. Au cours de la journée, je dois pouvoir rechercher certaines données présentes dans les csv.

    Pour le moment j'ai tester 2 solutions pour lire mes fichiers et j'ai comparé les temps.

    1) Lire mes fichiers csv et les mettre dans une dataframe avec pandas. 6s pour le plus gros fichier.

    import pandas as pd

    import pandas as pd
    
    Path_TBT = "monpath"
    
    df = pd.read_csv(Path_TBT + 'FICHIER.csv', dtype=str, index_col=False, sep=';')
    
    print(df)
    



    2) Importer les csv dans une db sqlite en début de journée et ensuite lire la table de la db sqlite  et la mettre dans une dataframe pandas.

    L'étape de la lecture prend 10s.

    import pandas as pd
    import sqlite3
    
    
    conn = sqlite3.connect("MaDB.db")
    
    df = pd.read_sql_query("SELECT * from FICHIERCSV", conn)
    print(df)
    
    conn.close()



    Je ne comprends pas pourquoi lire ma db et l'importer dans une dataframe est plus longue que lire un csv et l'importer dans une dataframe.

    J'ai lu sur plusieurs sites qu'il était plus intéressant de passer par une db mais ces résultats ne m'encouragent pas a partir sur cette option.

    Pourriez-vous m'éclairer.

    Merci d'avance pour votre aide

    -
    Edité par IIWombatII 17 janvier 2018 à 13:23:52

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2018 à 13:38:46

      Il faut comprendre que lire un csv est une opération optimisée en C avec pandas, ce qui rend le processus extrêmement rapide. Dans le cas de la lecture d'une base SQL, tu dois passer d'abord par la requête et remplir progressivement la dataframe, ce qui rend le processus plus long. Plusieurs paramètres peuvent être pris en compte dans ton choix. Le premier est le besoin impératif ou non de charger en mémoire l'ensemble de tes informations ou pas. Si tu as besoin que d'une fraction de ta dataframe lors de tes requêtes, une BDD est préférable avec une requête SQL adaptée. La maintenance est aussi importante, si ta quantité de données augmente de manière exponentielle, lire/récrire toutes tes informations sera au final plus long que rajouter des valeurs dans ta BDD. L'impact en mémoire est aussi important, le csv c'est du texte, si je ne dis pas de conneries la BDD écris en mémoire avec du typage, l'espace disque sera ainsi plus optimisée (à vérifier). Il y a encore d'autres points, mais c'est au final assez spécifique de l'utilisation que tu souhaites en faire, d'autant plus que SQLITE n'est qu'un seul moyen de faire de la BDD.
      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2018 à 15:18:56

        Merci beaucoup pour la réponse super rapide!

        Je ne sais toujours pas vraiment quoi choisir, mais ou moins je sais pourquoi le read csv est plus rapide dans ce cas si.

        Le  script doit me permettre de faire 2 choses

        1/Une suite de query qui vont me permettre de calculer un résultat que je stockerais dans une db. En gros les 5 csv d'une journée seront compressés en à peu près 100.000 lignes et 10 colonnes et ce résultat sera ajouté à une table historique.

        2/En cours de la journée je dois pouvoir rechercher tout ce qui concerne un élément à travers les 5 csv et l'historique. Exemple : je veux taper "Clarck kent" savoir tout ce qu'il a fait aujourd'hui et avoir un résumé de ce qu'il a fait les jours précédents. Donc en gros je dois rechercher des éléments dans ma db mais aussi dans les csv.

        Autre chose mes csv change très peu d'un jour à l'autre est ce que je dois faire une mise à jour ou effacer la table pour la réimporter qu'est ce qui est plus rapide selon vous?

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2018 à 16:52:40

          Donc si j'ai bien compris :

          1. Tu loads 5 fichiers csv qui sont modifiés de manière journalière

          2. Tu compresses ces fichiers en une table de 100k lignes que tu ajoutes à une DB "historique"

          3. Tu dois pouvoir faire une requête qui combines des infos de ta DB "historique" et ton csv

          Et ta question est : Est-ce que je ne devrais pas sauvegarder ma table historique dans un fichier csv ? C'est bien ça ? Histoire que l'on soit clair.

          Une autre question : Est-ce que tu supprimes des lignes progressivement dans ta DB "historique" ? J'imagine que oui, quelle serait alors sa taille maximum ?

          • Partager sur Facebook
          • Partager sur Twitter
            18 janvier 2018 à 12:34:56

            Je penses que je vais tout mettre dans la db.

            Chaque jour je vais importer les fichier csv dans leurs table respective de la db en écrasant les valeurs précédentes.

            Ca sera plus facile de gérer une seul source de donnée pour mes requêtes suivantes.

            Merci beaucoup pour les infos. 

            • Partager sur Facebook
            • Partager sur Twitter

            Python Pandas SQLITE vs CSV

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown