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

  1. #21
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Pour moi, oui, c'est normalque le "single-threaded" soit meilleur.

    Concernant le cas de pandas : celui-ci doit tout faire en mémoire tandis que dask est plus adapté au distribué, c'est difficile de faire le comparatif.

    Sur une énorme volumétrie et une multitude de calcul (ici, je parle en terme d'utilisation de clustering), je pense que dask sera gagnant car il est pensé pour ça.

    Mais pour des cas où tout tient en mémoire, c'est pandas qui sera gagnant (enfin, c'est mon point de vu).
    Cordialement.

  2. #22
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Citation Envoyé par AvySamaj Voir le message
    Bien que pour pandas il s'agisse d'un problème de disque dur?
    Chargez le dataframe pandas directement: çà devrait être aussi rapide sinon plus et utiliserait moins de ressources.

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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Points : 75
    Points
    75
    Par défaut Mise à jour. Plus autant de latence.
    J'ai continué à chercher et j'ai trouvé une solution qui fait que ça va aussi vite, selon le jour..., que pandas.
    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
    import dask.dataframe as dd
    import pandas as pd
     
    def fonction_df(game):
        try:
             df=dd.from_pandas(pd.DataFrame(course, 
                                       index=[course['_id']]*len(course['classement'])), 
                                       npartitions=4)# Après tatônnement 4 partitions dans ce cas de figure c'est un des facteurs de vitesse. On ne fait donc plus un dataframe pandas ==> 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(game),
          games)) # list of dictionnaries where each one is a game
    
    df=delayed(pd.concat)(dfs,axis=0)# Ici on utilise pandas.concat et non plus dask.dataframe.concat, ainsi on respecte ce que préconise la doc
    df=dd.from_delayed(df)# Au lieu de faire compute() sur l'objet delayed on utilise la méthode from_delayed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %%time
    sys.getsizeof(df.compute(scheduler="single-threaded"))# 652 ms et 2307862bytes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %%time
    sys.getsizeof(pd.concat(dfs))# 477 ms et 2307862bytes /!\ pour se faire, la fonction fonction_df() reprend l'ancienne méthode df=pd.DataFrame(game, index=[game['_id']]*len(game['rank'])), sinon renvoit une erreur.
    Il est aussi lourd que pandas.DataFrame quand on utilise la méthode compute() sur le dataframe de dask,mais en dehors il consomme beaucoup moins de mémoire, aujourd'hui il est un peu plus long pcq hier j'avais réussi à avoir les même temps:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sys.getsizeof(df)# 56 bytes
    J'espère ne pas me tromper, mais avoir 56 bytes pour faire des calculs tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import dask.dataframe as dd
    df = dd.read_parquet('...')
    data = df[['age', 'income', 'married']]
    labels = df['outcome']
     
    from dask_ml.linear_model import LogisticRegression
    lr = LogisticRegression()
    lr.fit(data, labels)
    source ici
    ça prend toujours moins de place qu'un dataframe pandas qui va peser en permanence 2307862bytes dans la mémoire, et encore que je n'ai pas encore créé de dummy variables, pcq on se contente rarement de données brutes pour se lancer dans des modélisations. Ais-je raison de le penser?

  4. #24
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Juste une question:

    Tu définis une fonction fonction_df mais tu utilises fonction_df_dask, c'est normal ?
    Cordialement.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Juste une question:

    Tu définis une fonction fonction_df mais tu utilises fonction_df_dask, c'est normal ?
    Ah pardon j'ai mal recopié à force d'avoir tripatouiller mon code je me suis emmêler les pinceaux dans l'édition mais j'ai bien vérifier dans mon notebook tout est ok et se déroule comme montré, je corrige ça de suite pour y mettre de la cohérence.

    Par ailleurs dans le tout premier message j'ai effectivement fait cette erreur mais je ne peux pas le modifier malheureusement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     #Tout Premier Message/ Tout Premier Code
    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), ## /!\ erreur de copie, utilise bien la fonction fonction_df() ci-dessus
          games)) ##list of dictionnaries where each one is a game

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Citation Envoyé par AvySamaj Voir le message
    Donc si je comprends bien, vouloir faire de l'out-of-core avec un seul disque dur à sa disposition c'est impossible? Est-ce qu'un disque dur externe branché par USB peut pallier à celà?
    faire de l'out-of-core, c'est avoir un tas de données sur disque (ici votre collection MongoDB) et pouvoir découper ce gros tas en parties pouvant être lues et analysées "en parallèle".

    Donc déjà, il faut arriver à dire à MongoDB que vous voulez balayer votre collection en parallèle et mettre en œuvre parallelCollectionScan à partir de pymongo.
    Comme vous n'avez qu'un seul disque, çà va juste essayer de lire les données plus vite mais si le disque ne suit pas, çà risque d'être juste plus long.

    La seule chose que vous pouvez faire, c'est lire les données d'un seul coup et paralléliser ensuite les opérations que vous faites dessus (pour autant que les opérations effectuées soient plus couteuses que la mise en œuvre de la parallélisation).

    - 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, 21h18
  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, 16h43
  3. Negociation, comment est ce possible?
    Par Jim_Nastiq dans le forum Paie
    Réponses: 11
    Dernier message: 31/07/2007, 17h03
  4. Comment est-ce possible ?
    Par Jibees dans le forum C
    Réponses: 25
    Dernier message: 05/09/2006, 12h08

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