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

Java Discussion :

[Conception] Java et manipulation grandes quantités de données


Sujet :

Java

Vue hybride

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut [Conception] Java et manipulation grandes quantités de données
    Bonjour,
    Je travaille actuellement sur un analyseur de listes de discussion. Chaque liste peut contenir de 100 messages à 200 000 messages, chaque message une douzaine de champs.
    Je dois faire des statistiques sur ces messages. Le problème, c'est que pour effectuer ces statistiques, je dois extraire les messages puis les manipuler pour les classer, les trier ... etc.
    Tout marche très bien avec 10 000 voire 50 000 messages. Mais le problème se corse avec 200 000 messages, ce qui entraine des dépassements de mémoire, que cela soit en tout objet (si j'utilise l'objet Message), ou en base de données (table Message).
    Dans le premier cas, la mémoire se sature lorsque j'applique des comparators sur plusieurs critères à mes messages (par sujet ET par date par exemple) afin de classifier les messages en discussion.
    Dans le second cas (avec H2), la mémoire se sature lorsque je fais un simple SELECT sur 3 champs de ma table Message.

    Java est-il inadéquat dans mon cas de manipulation de grandes quantités de données ou avez-vous des idées qui pourraient me sortir de l'impasse ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 100
    Par défaut
    Bonjour maccormick,

    Je ne sais pas quels types de comparaisons tu souhaites faire, si tes données sont rangées dans un fichier Excel tu peux faire des comparaisons statistiques avec matlab (voir scilab qui est gratuit), donne nous plus de precisions sur le type de comparaisons.

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut
    Salut,
    Je travaille directement sur les fichiers EML :
    1/ j'importe une boite aux lettres (répertoire de fichiers EML)
    2/ j'extrais les messages avec l'API javamail (getSubject(), getFrom() ... etc
    3/ je fais des calculs dessus, notamment la classification en conversation, ce qui me pose actuellement problème. Voilà comment ça se déroule :
    1/ je tronque les sujets des messages à 15 caractères, en ayant enlever tous les caractères supplémentaires (-, ., ... etc)
    2/ je range les messages selon leur sujet tronqué ET leur date d'envoi
    3/ j'itère ma liste de message et je les classe en conversation selon :
    - si le message en cours a le même sujet tronqué que le précédent, je regarde sa date d'envoi. si celle-ci est inférieure ou égale au paramètre fourni, je le range dans la même conversation, sinon je crée une nouvelle conversation
    - sinon, je regarde sa distance de Levenshtein d'avec le message précédent (qui est une distance calculée selon les caractères en commun) : si elle est inférieure au paramètre fourni, je regarde la date puis je le range ou pas dans la même conversation, sinon je crée une nouvelle conversation

    Mon algorithme repose donc essentiellement sur le TRI (j'effectue ensuite d'autres statistiques dans lesquels j'effectue beaucoup de tris) et le problème vient de là lorsque je ne fais que de l'objet (un comparator sur 2 paramètres sur 200 000 messages me plantent le système !)

  4. #4
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut ppa
    Apparemment, ton problème vient de tes stats.
    Je ne pense pas que tu devrais tout charger en mémoire.

    Tout d'abord : une question : Mis à part pour les statistiques, as-tu besoin de garder tous les messages après intégration ?

    2 pistes s'offrent à toi :
    - Construire (calculer) tes statistiques au fur et à mesure de l'intégration (sans stockage en mémoire : les données ne font que passer, seules les stats restent).
    - Si, comme tu l'as évoqué précédemment, tu stocke tout en base, pourquoi ne récupères-tu pas des stats via des storeProc ? (Attention : le calcul devra se faire dans la requête : ici encore, tu ne charge pas tout en mémoire pour calculer les stats en java, mais bien en SQL)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut
    Citation Envoyé par NeptuS Voir le message
    Tout d'abord : une question : Mis à part pour les statistiques, as-tu besoin de garder tous les messages après intégration ?
    Pour l'instant oui, mais je réfléchis à l'usage d'avoir 200 000 messages sous les yeux

  6. #6
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par NeptuS Voir le message
    - Si, comme tu l'as évoqué précédemment, tu stocke tout en base, pourquoi ne récupères-tu pas des stats via des storeProc ?
    Histoire de clarifier les choses, je suppose que tu sous-entends par "storeProc", les procédures stockées ?
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  7. #7
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    Oui.
    Il manque peut-être un 'd', histoire d'écrire en Anglais presque correct : "storedProc", Alias "Stored Procedure"

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Bonjour,

    Il ne faut pas tout charger en mémoire, avec un volume pareil il te faut une stratégie différente. Tu dois faire un batch qui prépare tes données dans des bases temporaires. Ensuite tu construits tes stats à partir de ces tables pré-calculées.

    Ensuite, il ne faut pas se leurrer pour de tel volume il faut une machine puissante.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut
    Oui oui, effectivement, à la base (c'est le cas de le dire ) j'ai un problème de conception, mais je sens quand même que d'avoir laisser tomber les bases de données me facilite le travail, et que je n'ai qu'à trouver un autre algo de classification ...
    et en plus les stored procedures ne vont ps m'aider je pense, car les calculs sont trop compliqués ...

  10. #10
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    Qu'est-ce que tu entend par "trop compliqués" ? Peux-tu donner un exemple de
    Tu veux dire par là que tu n'arriverai pas à faire la requête ou bien que le SGBD n'en est pas capable ?

    Autre info importante : Tes stats devront-elles être calculées en temps réel ? Seront-elles historisées ?

    Si tu stocke tes données sur le filesystem, tes temps de recherche vont augmenter de façon exponentielle avec le volume, alors que si tu utilise un SGBD, le temps de recherche augmentera à peu près linéairement grâce aux index.
    Dans les 2 cas, la recherche multi-critères augmente grandement le temps de réponse.

  11. #11
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    mais si faut tout charger en mémoire (si tu veux des grosses perfs), faut juste le faire proprement.

    plusieurs choix : memcache (un demon unix que tu peux sharder sur plusieurs machines). ça fait du clé valeur, c'est limitant en terme de modele. mais après, tu peux tout parcourir comme un bourrin, et comme c'est pas de la mémoire java, pas de probleme de GC

    autre solution : Grid computing + mapReduce pour le requetage.
    voir http://fr.wikipedia.org/wiki/Hadoop hadoop par exemple.

    (bon, c'est pas du petit projet pour rigoler par contre, mais une vraie solution industrielle de traitement de données en masse)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Manipulation d'une grande quantité de données
    Par sebastyen dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2008, 15h54
  2. [Conception] Taille d'une grande base de données
    Par caranta0013 dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 28/03/2007, 09h43
  3. Une grande quantité de données sur Oracle 8i?
    Par bliml dans le forum Oracle
    Réponses: 13
    Dernier message: 01/03/2007, 11h45
  4. Réponses: 1
    Dernier message: 10/01/2007, 15h52
  5. dao mette à jour de grandes quantités de données
    Par random dans le forum Contribuez
    Réponses: 8
    Dernier message: 14/06/2006, 20h25

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