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

Calcul scientifique Python Discussion :

Comment est-ce possible de saturer la mémoire avec un dataset de taille inférieure à la mémoire?


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Par défaut Comment est-ce possible de saturer la mémoire avec un dataset de taille inférieure à la mémoire?
    Pour commencer j'utilise un notebook jupyter et voici comment j'importe mes données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %%time
    import pymongo
    from pymongo import MongoClient
    connection         = MongoClient()
    db                 = connection.adb
    games=list(db.Collection.find({}).limit(100000))
    ça prend Wall time: 54.7 s à être fait, tandis que la taille de l'objet games est de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sys
    sys.getsizeof(games) ##879840 bytes, so 0.87984 MB
    L'objet games est une liste de dictionnaires puisqu'il est issue d'un tas de fichiers json. Notons que les 100 000 fichiers ici sont proches de ce que la collection comporte en entier: 143 403 fichiers.

    Maintenant concernant le code ci-dessous avec lequel je fais un dask.dataframe prend 9min 37s.

    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
    import dask.dataframe as dd
    import pandas as pd
     
    def fonction_df(game):
        try:
            df=pd.DataFrame(game, index=[game['_id']]*len(game['rank']))        
            return df
        except:
            print('problem with:{}'.format(game['_id']))
     
    dfs=list(map(lambda game: 
          fonction_df_dask(game),
          games)) ##list of dictionnaries where each one is a game
     
    df=delayed(dd.concat)(dfs,axis=0,interleave_partitions=True)
    Le type de df est dask.delayed.Delayed et sa taille vaut 160 bytes. D'ailleurs quelque soit le nombre de fichiers importé, 100 ou même 1000, indique toujours 160 bytes.

    Maintenant pour éviter une saturation de la mémoire je vais appliquer la méthode compute() sur df mais avec un échantillon encore plus réduit de 100 fichiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type(df.compute()) # donne un objet dask.dataframe.core.DataFrame.
    Sa taille se réduit encore par rapport à précédemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sys.getsizeof(df.compute())
    112 bytes.

    Mais un objet dask.dataframe.core.DataFrame n'est pas très utile à la visualisation des données, comme vous pouvez le voir ci-dessous:

    npartitions=471 _id A B ...
    1 object object object ...
    2 ... ... ... ...
    ... ... ... ... ...
    100 ... ... ... ...

    Dask Name: concat-indexed, 445568 tasks

    Pour avoir un dataframe utilisable pour jeter un oeil sur les données j'utilise . La taille des données pour les 100 fichiers passent à 3.42MB, et devient un objet pandas.core.frame.DataFrame tel que c'est dit dans la documentation de dask d'ailleurs. J'imagine donc qu'avec la totalité des fichiers 143 403 files on atteindrait environ 3.4GB et même un peu plus.

    Mais le soucis pour 100 fichiers c'est que ces 3.42MB lui prenne 43s à être executé avec df.compute().compute(). En tentant de passer à 1000 fichiers ça prenait trop de temps j'ai interrompu le kernel. Cette fois la taille dépend vraiment du nombre de fichiers importés.
    Pourtant en regardant mon gestionnaire de tâches j'ai 3085Mo de disponibles avant de lancer ces opérations.

    La taile de 3.42MB me semble ridicule par rapport à au 3Go disponibles et ça prend presque 1 minute. Pour 34.2MB ça prend un temps pas possible que j'ai même pas pu calculé. Comment est-ce possible?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 776
    Par défaut
    Salut,

    Plusieurs choses:

    • sys.getsizeof retourne juste la taille d'un objet et non de ce qu'il contient.
    • Charger un fichier de 3/4Go en mémoire est une chose, demander à Pandas de structurer tout çà pour en faire un Dataframe en est une autre et çà va avoir des impacts sur la mémoire et la durée.
    • Utiliser au mieux les ressources de la machine pour obtenir des temps de réponses raisonnables dépend de la taille du problème à traiter.
      Par exemple, si on peut trier avec n'importe quel algorithme une liste de 10 éléments en un temps raisonnable....
      Par contre pour trier des dizaines de millions d'items impossibles à charger en mémoire car il faudrait faire travailler 50 CPU pour obtenir des temps de réponse acceptables... c'est pas avec les algo. de bases qu'on pourra s'en sortir.



    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    [*]sys.getsizeof retourne juste la taille d'un objet et non de ce qu'il contient.
    Ça j'ai vu, c'est pour ça que j'ai précisé la taille ET le type.

    Citation Envoyé par wiztricks Voir le message
    [*]Utiliser au mieux les ressources de la machine pour obtenir des temps de réponses raisonnables dépend de la taille du problème à traiter.
    Par exemple, si on peut trier avec n'importe quel algorithme une liste de 10 éléments en un temps raisonnable....
    Par contre pour trier des dizaines de millions d'items impossibles à charger en mémoire car il faudrait faire travailler 50 CPU pour obtenir des temps de réponse acceptables... c'est pas avec les algo. de bases qu'on pourra s'en sortir.
    - W
    Certes 10 c'est pas suffisant mais j'ai bien précisé que ça durait très longtemps même à 1000 pour une taille dérisoire. Pcq oui c'est une taille dérisoire pour du pandas, j'ai déjà chargé plus lourd que 1000 fichiers, beaucoup plus ça durait plusieurs dizaine de minutes, mais là je vous dit vraiment que c'est interminable et donc ça ne m'aide pas pcq ça n'explique pas que pour plus de fichiers dans pandas marche plus vite qu'en passant par dask.
    À la limite je m'attend plus à des pistes de solutions sur un forum de développeurs que des généralités comme Quora.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 776
    Par défaut
    Citation Envoyé par AvySamaj Voir le message
    À la limite je m'attend plus à des pistes de solutions sur un forum de développeurs que des généralités comme Quora.
    Si vous voulez autre chose que des généralités, il faut déjà fournir de quoi reproduire le problème (et pas juste en causer).
    Et vous vous rendez bien compte que s'il faut charger 3/4Go de données en mémoire, pas grand monde prendra le temps de tout charger pour juste s'assurer que çà plante ou pas.
    Pour aller au delà, il va falloir regarder l'adéquation des ressources systèmes à ce que demande le processus qui tourne votre programme.
    Ce qui suppose d'avoir une petite idée sur comment elles sont gérées et savoir utiliser les outils qui permettent d'y regarder ce qu'il s'y passe... et cela dépend de l'environnement système.
    Et pour autant que les gens qui savent faire çà aient un peu de temps pour vous aider, c'est tellement prise de chou qu'il va falloir commencer à expliquer pourquoi vous êtes obligé de tout charger en mémoire en même temps et si tel est le cas, on va se pencher sur les performances de votre machine: si c'est une brouette ou que certains sous systèmes sont sous dimensionnés, ben çà ne fonctionnera pas.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous voulez autre chose que des généralités, il faut déjà fournir de quoi reproduire le problème (et pas juste en causer).
    Ca pourquoi pas mais je ne sais pas comment je pourrais vous passer les données de ma base mongo. A la limite on commençait par ça peut être, mais de toute façon j'ai pas l'impression que vous soyez venus dans l'intention d'aider vu votre discours depuis le début où vous me parlez de millions d'items alors que j'ai écris noir sur blanc qu'il y en avait 143 000. Pourquoi aller chercher dans les exagérations et de ce que j'ai pas dit? Pour pas faire avancer le schmilblick tout simplement.

    Citation Envoyé par wiztricks Voir le message
    Et vous vous rendez bien compte que s'il faut charger 3/4Go de données en mémoire, pas grand monde prendra le temps de tout charger pour juste s'assurer que çà plante ou pas.
    Pour aller au delà, il va falloir regarder l'adéquation des ressources systèmes à ce que demande le processus qui tourne votre programme.
    Là je crois qu'on parle vraiment pas de la même chose et que vous lisez pas en fait. J'ai précisé que pour des objets de quelques MB j'ai déjà des soucis alors que ma RAM dispo est elle de plus de 3Go.
    Oui toute la base chargée dans un objet pandas ferait 3.4GB, mais j'en suis même pas là dans le problème que j'expose à la fin.

    Citation Envoyé par wiztricks Voir le message
    Et pour autant que les gens qui savent faire çà aient un peu de temps pour vous aider, c'est tellement prise de chou qu'il va falloir commencer à expliquer pourquoi vous êtes obligé de tout charger en mémoire en même temps et si tel est le cas, on va se pencher sur les performances de votre machine: si c'est une brouette ou que certains sous systèmes sont sous dimensionnés, ben çà ne fonctionnera pas.
    Excusez moi votre grandeur de ne pas en savoir autant sur la gestion de mémoire et c'est pour ça que je pose des questions d'ailleurs, pcq si je savais déjà je ne demanderais même pas.
    Si votre propos c'est de me dire qu'ici c'est un microcosme où on ne parle qu'entre développeurs déjà bien expérimentés bah restez entre vous, ça m'embête mais je ferais avec. Je me demande même pourquoi vous venez réponde si d'avance ça vous embête autant. J'ai l'habitude de Stackoverflow, mais là pas de réponse, mais ça traite pas les gens comme des noobs quand ils ne connaissent pas la solution et quand ça les intéresse pas à la limite ils répondent pas pour dire "oh bah en fait votre problème il m’intéresse pas je voulais juste vous le dire". Quant à la brouette j'ignorais que les Thinkpad étaient des merdes sans nom, excusez du peu, c'est pas un avion de chasse mais c'est pas un ordi de merde non plus. Enfin quand vous aurez fini de faire des présupposés à la mord moi le nœud peut-être qu'on pourra avancer, mais pour le moment je vous sens pas prêt. Et dès fois que vous ne sauriez pas Dask est aussi prévu pour les ordinateurs qui n'ont pas une puissance phénoménale de 50CPU comme vous le disiez... 3GB c'est pas du big data non plus, si c'était en TB ouais ok, mais là on n'y est pas. Un peu de doc ça vous dit? Ah non c'est vrai vous avez pas le temps j'avais oublié.

    Bien à vous.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 776
    Par défaut
    J'essaie juste de vous sensibiliser sur ce qu'on appelle la complexité... i.e. les surprises qu'on a lorsqu'on multiplie la taille d'un problème d'un facteur 10, 100,... car les algorithmes ne sont pas linéaires et les ressources que pourra fournir un système limitée par un ou plusieurs goulots d'étranglements.

    Après côté résolution de problème, vous avez d'un côté un tas de causes probables (et les capacités de votre ordinateur en sont une)... et de l'autre des analyses (avec des outils et des compétences) qui vont permettre de les éliminer au fur et à mesure.

    Quant à la brouette j'ignorais que les Thinkpad étaient des merdes sans nom, excusez du peu, c'est pas un avion de chasse mais c'est pas un ordi de merde non plus.
    Ignorer l'hypothèse que votre machine puisse être sous-dimensionnée pour absorber la charge demandée, c'est juste réduire le champ d'investigations des causes possibles en disant "çà je ne veux pas l'entendre, donc pas la peine de perdre votre temps à essayer de le démontrer...".

    Ceci dit si vous utilisez mongodb et scat dans un même environnement système, c'est juste pour mettre au point des codes avec un jeu de données significatif mais réduit puis le déployer ensuite sur une architecture distribuée (plein de serveurs, de mémoire et de capacités de stockage) répondant à ces questions de limites côté ressources.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Erreur intermitente ! Comment est-ce possible ?
    Par shenzhu dans le forum Général Java
    Réponses: 6
    Dernier message: 17/05/2010, 20h18
  2. HashMap en multi-thread et NullPointerException ; comment est-ce possible ?
    Par sami44 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 09/01/2008, 15h43
  3. Negociation, comment est ce possible?
    Par Jim_Nastiq dans le forum Paie
    Réponses: 11
    Dernier message: 31/07/2007, 16h03
  4. Comment est-ce possible ?
    Par Jibees dans le forum C
    Réponses: 25
    Dernier message: 05/09/2006, 11h08

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