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 :

Calcul du md5 de millions de fichiers


Sujet :

Java

  1. #61
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Personnellement, j'utilise plutôt JProfiler (qui est payant, mais tu peux utiliser une licence d'evaluation renouvelable) qui te simplifie l'interpretation des chiffres par rapport à celui de netbeans.

    Concernant ton problème, il est problable que ton problème vienne de ta base, où de la manière dont tu l'interroges où que tu y accèdes. Le profiler t'aidera en parti pour cibler le problème, si tu vois que tu as beaucoup de thread en attente de connexion à la base, c'est par exemple que ton pool de connexion est mal configuré (quoi que, est ce que tu fait du multi-thread ?, donc des accès multiple à la base ?)

    Pour tes requetes SELECT, est ce que tu as les bon index ? Quel est la volumetrie de ta table principale ? est ce que tu as déjà des millions de lignes ou seulement 135 ?

  2. #62
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Personnellement, j'utilise plutôt JProfiler (qui est payant, mais tu peux utiliser une licence d'evaluation renouvelable) qui te simplifie l'interpretation des chiffres par rapport à celui de netbeans.
    Ok je vais essayer de voir, mais c'est sous RedHat :/

    Concernant ton problème, il est probable que ton problème vienne de ta base, où de la manière dont tu l'interroges où que tu y accèdes. Le profiler t'aidera en parti pour cibler le problème, si tu vois que tu as beaucoup de thread en attente de connexion à la base, c'est par exemple que ton pool de connexion est mal configuré (quoi que, est ce que tu fait du multi-thread ?, donc des accès multiple à la base ?)
    Non pas de multi-threading, ça serait peut-être plus rapide, mais j'ai pas assez pratiqué les thread pour mettre ça en place dans une entreprise, j'ai préféré la jouer tranquille quoi :/

    Pour tes requetes SELECT, est ce que tu as les bon index ? Quel est la volumetrie de ta table principale ? est ce que tu as déjà des millions de lignes ou seulement 135 ?
    Euh oui j'ai fait beaucoup d'index..
    Et oui il y a presque 2 000 000 d'enregistrements dans la table... C'est ça qui ralentit ? mais ça sera toujours le cas, yaura même plutôt 100 000 000 d'enregistrements.. :/
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  3. #63
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Je comprends pas.. J'suis désespéré... :'(
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  4. #64
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Ouais mais je ne vois pas trop comment je peux faire ça.
    En "gros"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from hashes where url like "/chemin/vers/ton/dossier/%"
    Une fois que t'as reçu le paquet en local (ce qui devrait être rapide), plus qu'à stocker ça dans une hashmap le temps de parcourir le dossier.




    Aussi, si, encore une fois, le seul traitement différencié est de savoir si on a eu un ajout / une modification / un rien, on peut s'en sortir sans devoir pomper au préalable la base de données:


    Si la base de données a une colonne "firstSeen" remplie en auto avec le timestamp courant.
    Si elle a une colonne "lastUpdated" avec la date de dernière mise à jour

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Tatable(name,path,hash,firstseen) VALUES ('lenom','lepath','lehash',ladate) ON DUPLICATE KEY UPDATE lastUpdated =  IF(hash<>'lehash',ladate,lastUpdated)
    Que tu peux du coup faire rentrer dans un batch jdbc facilement pusique c'est la même requête pour tout le monde.



    Un fois tout scanné, tu peux finalement créer ton fichier de log avec trois requetes simple:

    les modifiés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Tatable where lastUpdate >= heureDeDebut and firstSeen < heureDeDebut
    les nouveaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Tatable where firstSeen >= heureDeDebut
    les pas modifiés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Tatable where lastUpdate < heureDeDebut

    En base de données, il faut éviter de mettre trop de logique du coté du code utilisateur et plutot du coté du serveur, c'est souvent plus performant

    Aussi, si t'as 50 process qui attaquent la base en parallèle, tu risque d'avoir un sacré goulot d'étranglement sur les transactions entre ces process.

  5. #65
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Est-ce que tu peux préciser pour l'écriture de fichiers, tu dis que tu as 50 fichiers qui sont écrits en même temps ? Si c'est le cas et que tu fais un flush() à chaque ligne c'est une horreur pour le systeme de fichiers, tu cumules tout ce qui est lent pour l'écriture.

    Il faut 1) toujours toujours utiliser un BufferedWriter qui garde les données en mémoire et les écrit par "paquet" de temps en temps 2) ne pas faire de flush() manuel sauf si tu as une bonne raison.

    Donc il faut que tu crées ton BufferedWriter, exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
    Ensuite tu passes ce BufferedWriter à tes fonctions de parcourt des répertoires et tu écris dedans à la place de la méthode WriteInFile. A la fin du processus quand tout a été analysé tu appelles writer.close().

    Une remarque tout de même sur la démarche : le MD5 est faible sur le plan cryptographique, ce qui veut dire qu'une personne mal intentionnée peut causer une collision intentionnellement. Je ne sais pas si c'est un problème dans ton application.

    Il existe également d'autres algorithmes plus rapides que MD5, ça vaut peut être le coup si ça fait gagner un jour ou 2 de calcul

  6. #66
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Salut et merci pour vos réponses !

    Merci Tchize, je vais essayer de mettre ça en place.
    Seulement j'ai pas trop compris comment tu veux différencier les fichiers modifié / ajouté / supprimé.
    Qu'est-ce que "heureDeDebut" ?
    Merci encore !

    Merci aussi à toi vic pour ta réponse !
    J'écrirai bien 50fichiers en même temps, mais seulement 1 par programme, juste que j'exécute 50 fois ce programme chacun sur une machine différente, et ils écrivent tous dans un fichier qui leurs est propre.
    Je comprends pas trop pour le flush, il me semblait que c'était un genre de commit pour les fichiers quoi, et que ça vidait ce qui avait en mémoire pour l'écrire. Je ne vois pas trop le problème mais je dois me tromper.

    En ce qui concerne le MD5, j'ai testé le md5 et le sha1 sur plusieurs fichier de taille différente, et ça a toujours été le md5 le plus rapide, d'où mon choix, seulement je ne doute pas qu'il y ait plus rapide (je suis preneur !). Même si le hash n'est pas l'élément bloquant dans mon programme, puisque en enlevant les accès BDD / écriture fichier, mon programme est 120 fois plus rapide (et il fait quand même le hash md5).
    Donc mon problème de lenteur ne viens pas du md5, même si une légère amélioration à ce niveau-là serrait quand même significative, j'aimerai quand même résoudre ce problème de lenteur..
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  7. #67
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Seulement j'ai pas trop compris comment tu veux différencier les fichiers modifié / ajouté / supprimé.
    Qu'est-ce que "heureDeDebut" ?
    Il te propose de te baser sur deux choses : la date de création et la date de mise à jour. "heureDeDebut" correspondra à l'heure de début de traitement. Cela te permettra de récupérer à la fin de ton traitement, les entrés (donc fichiers) qui ont été modifiées ou créées lors de ton dernier traitement. Cela te permettra de limiter grandement le nombre de requete réalisée sur la base, cause probable de tes lenteurs.

    Citation Envoyé par Sennad Voir le message
    J'écrirai bien 50fichiers en même temps, mais seulement 1 par programme, juste que j'exécute 50 fois ce programme chacun sur une machine différente, et ils écrivent tous dans un fichier qui leurs est propre.
    Je comprends pas trop pour le flush, il me semblait que c'était un genre de commit pour les fichiers quoi, et que ça vidait ce qui avait en mémoire pour l'écrire. Je ne vois pas trop le problème mais je dois me tromper.
    Le flush te permet de réellement écrire dans le fichier, et c'est cela qui est réellement couteux, notamment l'ensemble des accès disques qui en découle. Le faire pour chaque ligne que tu souhaites est couteux, mieux vaut le faire une fois de temps en temps.
    De plus si tu fais des accès concurrents, ça peux poser problème ( mais cela ne semble pas être ton cas ).

    Citation Envoyé par Sennad Voir le message
    En ce qui concerne le MD5, j'ai testé le md5 et le sha1 sur plusieurs fichier de taille différente, et ça a toujours été le md5 le plus rapide, d'où mon choix, seulement je ne doute pas qu'il y ait plus rapide (je suis preneur !). Même si le hash n'est pas l'élément bloquant dans mon programme,
    puisque en enlevant les accès BDD / écriture fichier, mon programme est 120 fois plus rapide (et il fait quand même le hash md5).
    Donc mon problème de lenteur ne viens pas du md5, même si une légère amélioration à ce niveau-là serrait quand même significative, j'aimerai quand même résoudre ce problème de lenteur..
    Pour l'instant, concentre toi sur les problèmes de lenteurs liés à l'accès à la base et aux fichiers...

  8. #68
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Il te propose de te baser sur deux choses : la date de création et la date de mise à jour. "heureDeDebut" correspondra à l'heure de début de traitement. Cela te permettra de récupérer à la fin de ton traitement, les entrés (donc fichiers) qui ont été modifiées ou créées lors de ton dernier traitement. Cela te permettra de limiter grandement le nombre de requête réalisée sur la base, cause probable de tes lenteurs.
    Okey mais je comprends toujours pas pourquoi "lastUpdate >= heureDeDebut and firstSeen < heureDeDebut" serait un fichier modifié ?
    Ca veut dire (si je ne me trompe pas) : je l'ai mis a jour (c'est a dire ?) après le début de traitement et firstSeen avant le début du traitement. Ça n'a aucun sens pour moi..
    De meme pour "firstSeen >= heureDeDebut"
    Et "lastUpdate < heureDeDebut" => mis à jour avant le début du traitement ?
    -> "firstSeen" remplie en auto avec le timestamp courant (A quel moment ??)
    -> "lastUpdated" la date de dernière mise à jour (Quelle mise à jour ??)
    -> "heureDeDebut" correspondra à l'heure de début de traitement. (Quel traitement ??)
    J'ai l'impression d'être lourd là, mais vraiment je comprends pas..

    Et comment faire pour mettre à jour la signature d'un fichier qui a était modifié ?
    Si je fais mes verifs à la fin, pour un fichier modifié je pourrais pas mettre à jour sa signature, je l'ai plus vu que je fais la vérif a la fin..
    Je suis un peu perdu là

    Le flush te permet de réellement écrire dans le fichier, et c'est cela qui est réellement couteux, notamment l'ensemble des accès disques qui en découle. Le faire pour chaque ligne que tu souhaites est couteux, mieux vaut le faire une fois de temps en temps.
    Okey parfait, mais du coup si j'enlève le flush de la méthode, j'appelle ma méthode plusieurs fois dans mon code, et au bout d'un moment j'appelle une méthode qui prend en paramètre ce writer, et qui fait un flush c’est ça ? Tous les 500 fichiers ça semble raisonnable ?

    Encore merci beaucoup pour le temps que vous passez sur mon sujet !!
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  9. #69
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Okey mais je comprends toujours pas pourquoi "lastUpdate >= heureDeDebut and firstSeen < heureDeDebut" serait un fichier modifié ?
    Ca veut dire (si je ne me trompe pas) : je l'ai mis a jour (c'est a dire ?) après le début de traitement et firstSeen avant le début du traitement. Ça n'a aucun sens pour moi..
    De meme pour "firstSeen >= heureDeDebut"
    Et "lastUpdate < heureDeDebut"
    -> "firstSeen" remplie en auto avec le timestamp courant (A quel moment ??)
    -> "lastUpdated" la date de dernière mise à jour (Quelle mise à jour ??)
    -> "heureDeDebut" correspondra à l'heure de début de traitement. (Quel traitement ??)
    J'ai l'impression d'être lourd là, mais vraiment je comprends pas..
    Si tu reprends la requete SQL unique de modification proposée :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Tatable(name,path,hash,firstseen) VALUES ('lenom','lepath','lehash',ladate) ON DUPLICATE KEY UPDATE lastUpdated =  IF(hash<>'lehash',ladate,lastUpdated)

    Celle ci fait plusieurs chose à la fois :
    1. Si le fichier n'existe pas dans ta table, elle te l'insert
    2. Si ton fichier existe (ON DUPLICATE KEY), il te met à jour la date => peux être faut il aussi mettre à jour le hash, à toi de voir.

    Tu dois faire ta requete uniquement si tu as constaté que ton hash n'est plus le même, i.e. que ton fichier a été modifié. Donc si ton fichier est modifié, alors sa date de mise à jour (lastUpdated) aura été mise à jour par ta requete.

    "firstSeen" est rempli à l'insertion
    "lastUpdated" est rempli à la mise à jour.

    Avec ça, si tu notes l'heure de début de traitement et de fin de traitement, tu peux facilement retrouver :
    * les entrées qui ont été créés
    * les entrees qui ont été modifiés

    tchize_ t'a donnée les requetes correspondantes.

    Citation Envoyé par Sennad Voir le message
    Et comment faire pour mettre à jour la signature d'un fichier qui a était modifié ?
    Si je fais mes verifs à la fin, pour un fichier modifié je pourrais pas mettre à jour sa signature, je l'ai plus vu que je fais la vérif a la fin..
    Le but est de le faire dans ta requete SQL unique de mise à jour

  10. #70
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Merci encore énormément !

    Je comprends très bien l’intérêt, et ce que l'on cherche à faire.
    Ça m'énerve parce que tu te donnes beaucoup de mal pour m'aider, mais j'y arrive pas...

    FirstSeen => La date de la toute première fois qu'on trouve le fichier.
    LastUpdate => Mit à jour si le fichier existe (modifié ou non)
    HeureDeDebut => "Heure de début de traitement" - De quel traitement on parle ?

    Et aussi comment adapter la requête SQL unique pour que si le hash est différent, qui soit mit à jour ?
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  11. #71
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Effectivement, j'ai été trop vite et oublié le hash, mais ce n'est pas bien compliqué à mettre:


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Tatable(name,path,hash,firstseen) VALUES ('lenom','lepath','lehash',ladate) ON DUPLICATE KEY UPDATE lastUpdated =  IF(hash<>'lehash',ladate,lastUpdated), hash='lehash'


    comme tu trouvera un exemple à la fin de la doc mysql sur on duplicate key
    http://dev.mysql.com/doc/refman/5.0/...duplicate.html

    LastUpdate => Mit à jour si le fichier existe (modifié ou non)
    Non dans la requête que j'ai fait, lastUpdate est mis à jour uniquement si le fichier est modifié (cf le IF(<modifié>,<nouvelle date>,<ancienne date>)) dans mas requête. C'est ce qui te permet justement de sortir la liste des modifiés à la fin de ton process.



    HeureDeDebut => "Heure de début de traitement" - De quel traitement on parle ?
    Du début de ton scanne. Je part du principe que ton programme ne sature pas ta base de données en continu et a pour but de se lancer comme un grand à intervalles réguliers.

    Tes temps de base de données me semblent quand même suspect. Tu en arrive à combien de requêtes exécutées par secondes dans tes tests actuels?

  12. #72
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Salut !!
    Merci pour ta réponse !

    Tes temps de base de données me semblent quand même suspect. Tu en arrive à combien de requêtes exécutées par secondes dans tes tests actuels?
    Actuellement mon programme tourne sur un gros répertoire, et mySql Workbench, dans l'onglet Dashboard m'indique entre 0 et 1 SELECT / sec :
    Nom : Capture.PNG
Affichages : 144
Taille : 72,2 Ko
    Nom : Capture.PNG
Affichages : 155
Taille : 70,2 Ko
    Nom : Capture.PNG
Affichages : 138
Taille : 72,7 Ko

    Sinon je pense avoir enfin compris !
    HeureDeDebut => "Heure de début de traitement" - De quel traitement on parle ?
    Du début de ton scanne. Je pars du principe que ton programme ne sature pas ta base de données en continu et a pour but de se lancer comme un grand à intervalles réguliers.
    Mon programme est lancé 1 fois par semaine, je stocke déjà le numéro de la semaine, pour trouver les fichiers supprimé, à la fin du traitement, je récupère tous ceux qui ont un num de semaine inférieur à celui actuel.
    Donc fichiers supprimés OK
    Ensuite nouveaux fichiers :
    firstSeen >= heureDeDebut OK
    Maintenant fichiers modifiés :
    "lastUpdate >= heureDeDebut and firstSeen < heureDeDebut"
    Pourquoi ne pas récupérer seulement ceux qui ont lastUpdate = semaine actuelle ?

    Récap :
    New files => firstSeen = currentWeek
    Modified files => lastUpdate = currentWeek
    Deleted files => currentWeek == getCurrentWeek();
    Où currentWeek est la colonne représentant le numéro de la semaine de début de traitement.

    Merci encore énormément !
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  13. #73
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Peux tu regarder le temps d'execution de ta requete SQL ? J'ai bien l'impression que celle-ci est très lente.
    Peux tu également nous montrer les index présents sur ta table ?

  14. #74
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Salut !

    Euh comment je récupère le temps de la requête ?
    Pour les index je fais ça dessuite !
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  15. #75
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Nom : Capture.PNG
Affichages : 155
Taille : 36,8 Ko
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  16. #76
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Mais je pense que le problème viens de l'installation de mySql..
    Je suis sous red hat, et je n’ai pas les droits roots.
    J'ai donc installé mon serveur dans un répertoire dans mon /home.
    J'ai modifié le my.cnf pour lui donner le root directory du server à savoir /home/mySqlServer/
    J’ai réussi à le démarrer, mais j'ai rien fais depuis, il est démarré depuis 3 mois, et a reçu beaucoup de requêtes.
    J'ai voulu le redémarrer, sauf que je ne peux même pas l'arrêter. Il me dit qu’il ne trouve pas certains fichiers, fichiers qu’il ne cherche pas dans le répertoire que je lui ai donné "/home/mySqlServer/".
    Bref impossible de redémarrer mySql..
    Peut-être le problème vient de là ?
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  17. #77
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Le Select a mit une fois 1sec, et une autre fois 2sec.. C'est hyper long omg..
    C'est ce que me dis NetBeans quoi. Il a fait juste un Select et affiché le résultat. Fini : BUILD SUCCESSFUL (total time: 2 second) et une autre fois sur un autre enregistrement 1sec.
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  18. #78
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Ce qui me fait le plus pensé que le probleme viens de la DB est que le InnoDB Buffer Pool est tout le temps à 100%.. :
    Nom : Sans titre.png
Affichages : 146
Taille : 32,9 Ko
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  19. #79
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Actuellement mon programme tourne sur un gros répertoire, et mySql Workbench, dans l'onglet Dashboard m'indique entre 0 et 1 SELECT / sec :
    mouais c'est bizarre. C'est plutot le comportement de ton programme qui m'intéresse. Suffit de faire nombre de requêtes faites par ton programme / (heure de fin- heure de départ) => ca donnera une idée des performance de ta requête. De plus ton workbench te donne une requête / seconde mais te dit que innodb lit comme un porc le disque (>100Mb/s). Tu peux nous montrer comment tu établis ta connection avec la base de données?
    Citation Envoyé par Sennad Voir le message
    Maintenant fichiers modifiés :
    "lastUpdate >= heureDeDebut and firstSeen < heureDeDebut"
    Pourquoi ne pas récupérer seulement ceux qui ont lastUpdate = semaine actuelle ?
    Parce que ça incluerait les nouveaux fichiers

    Citation Envoyé par Sennad Voir le message
    Récap :
    New files => firstSeen = currentWeek
    Modified files => lastUpdate = currentWeek and firstSeen != currentWeek
    Deleted files => currentWeek == getCurrentWeek();

    Citation Envoyé par Sennad Voir le message
    Le Select a mit une fois 1sec, et une autre fois 2sec.. C'est hyper long omg..
    C'est ce que me dis NetBeans quoi. Il a fait juste un Select et affiché le résultat. Fini : BUILD SUCCESSFUL (total time: 2 second) et une autre fois sur un autre enregistrement 1sec.
    Oui, mais attention, ceci inclu le temps pour établir une connection avec le serveur.

  20. #80
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Tu peux nous montrer comment tu établis ta connection avec la base de données?
    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
     public static final void loadMySQLDriver() {
            try {
                Class.forName(com.mysql.jdbc.Driver.class.getName());
            } catch (Exception e) {
                throw new RuntimeException("Driver failed to load");
            }
        }
     
        public static final Connection getConnection() {
            try {
                return DriverManager.getConnection(Constants.getConnectionString(), Constants.DB_USER, Constants.DB_PASSWORD);
            } catch (SQLException e) {
                System.out.println(e.getSQLState());
                System.out.println(e.getMessage());
            }
            return null;
        }
    La methode loadMySqlDriver est appelée une seule fois.
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public static final String getConnectionString() {
            String ip = "";
            String port = "";
            String databaseName = "";
            String StringToReturn;
            try (BufferedReader in = new BufferedReader(new FileReader(ConfigurationFile_PATH));) {
                String line;
                while ((line = in.readLine()) != null) {
                    if (line.equals("IP SERVER MySQL =")) {
                        line = in.readLine();
                        ip = line;
                    }
                    if (line.equals("PORT MySQL =")) {
                        line = in.readLine();
                        port = line;
                    }
                    if (line.equals("DATABASE NAME =")) {
                        line = in.readLine();
                        databaseName = line;
                    }
                }
                StringToReturn = CONNECTOR + "://" + ip + ":" + port + "/" + databaseName; //CONNECTOR = jdbc
                return StringToReturn;
            } catch (Exception e) {
                System.out.println("!! Problem getting connection string DB !!");
                e.printStackTrace();
                throw new RuntimeException();
            }
        }
    Récap :
    New files => firstSeen = currentWeek
    Modified files => lastUpdate = currentWeek and firstSeen != currentWeek
    Deleted files => currentWeek == getCurrentWeek();
    Ok parfait
    Oui, mais attention, ceci inclu le temps pour établir une connection avec le serveur.
    Oui effectivement..
    Je suis actuellement a environ 2fichiers/secondes.. (J'ai réussi a gagner un peu en augmentant (128Mo -> 2 Go) le "InnoDB buffer pool")
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

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

Discussions similaires

  1. comment calculer le md5 du contenu d'un fichier
    Par c.plus.plus dans le forum Débuter
    Réponses: 6
    Dernier message: 01/01/2012, 17h54
  2. Calculer le MD5/SHA-256 d'un fichier
    Par PierrotY dans le forum Sécurité
    Réponses: 26
    Dernier message: 06/04/2009, 09h35
  3. calcul et boucle sur lecture de fichier
    Par marinaetsonchat dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 22/11/2007, 15h15
  4. Proramme qui calcul l'espace que prend un fichier sur le HDD
    Par snoopy69 dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 26/01/2007, 17h05
  5. Calculer le MD5 d'un fichier octet par octet
    Par bouazza92 dans le forum C
    Réponses: 5
    Dernier message: 09/08/2006, 20h39

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