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. #41
    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

    C'est con, il manque la partie dont j'(avais besoin, les ddl de l'unique table que tu utilise, pour voir si il n'y a pas de bourdes performances dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE `ReferencesFiles` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `Name` varchar(250) NOT NULL,
      `URL` varchar(500) NOT NULL,
      `Signature` varchar(100) NOT NULL,
      `Checked` tinyint(1) DEFAULT NULL,
      PRIMARY KEY (`Id`),
      UNIQUE KEY `Id_UNIQUE` (`Id`),
      KEY `ReferencesFiles_Name_IDX` (`Name`),
      KEY `ReferencesFiles_Signature_IDX` (`Signature`),
      KEY `ReferencesFiles_Checked_IDX` (`Checked`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1284845 DEFAULT CHARSET=utf8;
    Sauf que, à part logger, tu ne fais rien de ce traitement différencié. Si c'est pour avoir le même résultat dans tous les cas, c'est inutile de différencier
    C'est le but de mon programme... C'est pas le même résultat, je vois pas où est-ce que tu vois que ça fait la même chose >< Si ils sont différent, je dis que ça a été modifié (C'est le SEUL but de mon application alors ça sert pas à rien mdr) et je met à jour le hash pour la prochaine fois que je passe.

    Si tu as absolument besoin de connaitre les Hash à l'avance pour savoir si c'est nouveau / modifié, récupère avec une seule requête tous les hash de ton répertoire, plutot que de le faire fichier par fichier. Il est bien plus rapide de récupérer 200 lignes en une seule fois que de demander 50 fois une seule ligne à une DB. Pour rappel, les DB sont optimisée pour traiter des données en masse, en général, plus que pour faire des aller-retour réseau
    Ouais mais je ne vois pas trop comment je peux faire ça.
    Si je récupère 200lignes, par exemple, comment je fais pour récupérer le hash de tel fichier ?.... Là je peux avec la db pasque je lui dis de select le hash where url=mon fichier
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  2. #42
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sennad Voir le message
    C'est le but de mon programme... C'est pas le même résultat, je vois pas où est-ce que tu vois que ça fait la même chose >< Si ils sont différent, je dis que ça a été modifié (C'est le SEUL but de mon application alors dis pas que ça sert à rien mdr) et je met à jour le hash pour la prochaine fois que je passe.
    C'est juste qu'en général on ne considère pas les logs comme un objectif.
    On a juste considéré que tu voulais mettre la BD à jour...


    Du coup y'a un truc qui me titille : que fait exactement la méthode Utils.ReportUtils.WriteInFile() ?


    a++

  3. #43
    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,

    Oui effectivement..
    Une fois qu'il a fini ( qu'ilS ONT fini plus précisément puisqu'il y aura 50 process qui vont chacun écrire dans un fichier, et à la fin je fusionne tous ces fichier, et j'envoie un mail au manager pour qu'il voilent les fichiers qui ont été ajouté / modifié / supprimé.
    Voilà la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static final void WriteInFile(String lineToWrite, String pathOfFileToWrite) {
            try {
                Writer writer = new FileWriter(pathOfFileToWrite, true);
                writer.write(lineToWrite);
                writer.flush();
                writer.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
                System.out.println("Impossible to write in " + pathOfFileToWrite + "file !");
            }
        }
    Ps : Ce que j'ai fait ne marche pas, s'il vous plait c'est vraiment beaucoup trop lent.. 2sec pour 135 fichier sans les accès DB / files et 4min avec.. C'est beaucoup trop long.. Quand je vais devoir faire 1To il va mettre environ 3années quoi.. au lieu de 1semaine...
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  4. #44
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Deux remarques :

    • Tu es définitivement fâché avec le try-with-ressource.
    • C'est ce que je craignais : tu ouvres/fermes le fichier a chaque fois que tu vas écrire une ligne dedans.
      Ce n'est certainement pas grand chose mais répéter des milliers (voir millions) de fois ca bouffe du temps pour rien...

      Même remarque que pour les PreparedStatement : ouvrir le fichier une fois pour tout le bloc.



    a++

  5. #45
    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 es définitivement fâché avec le try-with-ressource.
    Oui je connaissais pas try-with-rescources avant, et depuis que tu me l'a dis j'ai pas encore arrangé tout le reste de mon programme.

    C'est ce que je craignais : tu ouvres/fermes le fichier a chaque fois que tu vas écrire une ligne dedans.
    Oui effectivement mais pour mon cas de figure où il y a que 135 fichiers, il ecrit casiment rien dans les fichiers, je veux dire que oui c'est un peu plus lent, mais ca dois pas être ca qui fait que c'est 120fois plus lent.. Mais oui il faut arranger ca.. Je sais pas comment, je faire "Writer writer = new FileWriter(pathOfFileToWrite, true);" et "writer.close();" dans la methode parseDirectory, et à la methode writeInFile je passe le writer ?

    Même remarque que pour les PreparedStatement : ouvrir le fichier une fois pour tout le bloc.
    Bah c'est ce que j'ai fais non ?
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    public class JdbcReferencesFilesDAO implements IReferencesFilesDAO {
     
        PreparedStatement pstmtInsertInReferencesFilesTableDB;
        PreparedStatement pstmtGetOldHashIfExist;
        PreparedStatement pstmtUpdateCheckedColumn ;
        PreparedStatement pstmtUpdateSignatureAndCheckedColumn;
     
        @Override
        public void parse(String path, Connection conn){
            try {
                conn.setAutoCommit(false);
                pstmtInsertInReferencesFilesTableDB = conn.prepareStatement("INSERT INTO ReferencesFiles (Name, URL, Signature, Checked) VALUES (?,?,?,?)");
                pstmtGetOldHashIfExist = conn.prepareStatement("SELECT Signature FROM ReferencesFiles WHERE URL=?");
                pstmtUpdateCheckedColumn = conn.prepareStatement("UPDATE ReferencesFiles SET Checked=1 WHERE URL=?");
                pstmtUpdateSignatureAndCheckedColumn = conn.prepareStatement("UPDATE ReferencesFiles SET Signature=?, Checked=1 WHERE URL=?");
                parseDirectory(path, conn);
                executeBatch(pstmtGetOldHashIfExist);
                executeBatch(pstmtInsertInReferencesFilesTableDB);
                executeBatch(pstmtUpdateCheckedColumn);
                executeBatch(pstmtUpdateSignatureAndCheckedColumn);
                pstmtInsertInReferencesFilesTableDB.close();
                pstmtGetOldHashIfExist.close();
                pstmtUpdateCheckedColumn.close();
                pstmtUpdateSignatureAndCheckedColumn.close();
                System.out.print("\n" + Constants.counter + "files found");
                conn.commit();
            } catch (Exception e) {
                System.out.println("Fatal error");
            }
        }
        @Override
        public void parseDirectory(String path, Connection conn) {
            File actual = new File(path);
            String actualPath;
            String actualName;
            String hash;
            String oldHash;
            try {
                for (File f : actual.listFiles()) {
                    actualPath = f.getAbsolutePath();
                    actualName = f.getName();
                    if (!f.getName().equals(".snapshot")) {
                        if (f.isDirectory()) {
                            parseDirectory(actualPath, conn);
                        } else {
                            Constants.counter++;
                            hash = Utils.HashUtils.hashFile(actualPath);
                            oldHash = getOldHashIfExist(actualPath, conn, pstmtGetOldHashIfExist);
     
                            if (oldHash != null) {
                                if (oldHash.equals(hash)) {
                                    updateCheckedColumn(actualPath, conn, pstmtUpdateCheckedColumn);
                                } else {
                                    Utils.ReportUtils.WriteInFile("Reference File MODIFIED : " + actualPath, Constants.REFERENCES_REPORTING_PATH);
                                    updateSignatureAndCheckedColumn(hash, actualPath, conn, pstmtUpdateSignatureAndCheckedColumn);
                                }
                            } else {
                                Utils.ReportUtils.WriteInFile("Reference File ADDED : " + actualPath, Constants.REFERENCES_REPORTING_PATH);
                                insertInReferencesFilesTableDB(actualName, actualPath, hash, conn, pstmtInsertInReferencesFilesTableDB);
                            }
                            System.out.print(".");
                            if (((Constants.counter) % 100) == 0) {
                                executeBatch(pstmtGetOldHashIfExist);
                                executeBatch(pstmtInsertInReferencesFilesTableDB);
                                executeBatch(pstmtUpdateCheckedColumn);
                                executeBatch(pstmtUpdateSignatureAndCheckedColumn);
                                System.out.print("\n" + Constants.counter + "files found");
                                conn.commit();
                            }
                        }
                    }
                }
            } catch (Exception e) {
                System.out.println("      Problem on " + path);
                Utils.ReportUtils.WriteInFile("Problem on " + path, Constants.LOGS_PATH);
            }
        }
     
        @Override
        public void insertInReferencesFilesTableDB(String name, String url, String hash, Connection conn, PreparedStatement pstmt) {
            try {
                pstmt.clearParameters();
                pstmt.setString(1, name);
                pstmt.setString(2, url);
                pstmt.setString(3, hash);
                pstmt.setInt(4, 1);
                pstmt.addBatch();
            } catch (SQLException e) {
                System.out.println("      Impossible to add " + name + " in ReferencesFiles Table !");
                Utils.ReportUtils.WriteInFile("Problem adding " + url + " file", Constants.LOGS_PATH);
            }
        }
     
        @Override
        public String getOldHashIfExist(String path, Connection conn, PreparedStatement pstmt) {
            try {
                pstmt.clearParameters();
                pstmt.setString(1, path);
                try (ResultSet rs = pstmt.executeQuery()) {
                    if (rs.first()) {
                        String hash = rs.getString(1);
                        return hash;
                    } else {
                        return null;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Problem checking if file of reference exist in DB (" + path + ")");
                Utils.ReportUtils.WriteInFile("Problem checking if file of reference exist in DB (" + path + ")", Constants.LOGS_PATH);
                return null;
            }
        }
     
        @Override
        public void updateCheckedColumn(String url, Connection conn, PreparedStatement pstmt) {
            try {
                pstmt.clearParameters();
                pstmt.setString(1, url);
                pstmt.addBatch();
            } catch (SQLException e) {
                System.out.println("Problem updating last checked date (" + url + ")");
            }
        }
     
        @Override
        public void updateSignatureAndCheckedColumn(String url, String newHash, Connection conn, PreparedStatement pstmt) {
            try {
                pstmt.clearParameters();
                pstmt.setString(1, newHash);
                pstmt.setString(2, url);
                pstmt.addBatch();
            } catch (SQLException e) {
                System.out.println("Problem updating signature (" + url + ")");
            }
        }
     
        @Override
        public void deleteRecord(String path, Connection conn) {
            try (PreparedStatement pstmt = conn.prepareStatement("DELETE FROM ReferencesFiles WHERE URL = ?")) {
                pstmt.setString(1, path);
                pstmt.executeUpdate();
            } catch (SQLException e) {
                System.out.println("Problem deleting " + path);
                Utils.ReportUtils.WriteInFile("Problem deleting " + path, Constants.LOGS_PATH);
            }
        }
     
        public void executeBatch (PreparedStatement pstmt) {
            try {
                pstmt.executeBatch();
            } catch (SQLException ex) {
                System.out.println("Impossible to execute batch");
            }
        }
    }
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  6. #46
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Oui effectivement mais pour mon cas de figure où il y a que 135 fichiers, il ecrit casiment rien dans les fichiers, je veux dire que oui c'est un peu plus lent, mais ca dois pas être ca qui fait que c'est 120fois plus lent..
    120 fois plus long c'était avec les 2 PreparedStatement créés à chaque itération de la boucle. Y a t'il eu des amélioration depuis ?


    Là tu as quasi 1 log par itération, dans pour 135 fichiers tu va ouvrir et refermer 135 fois le fichier de logs (et encore c'est des opérations I/O "lourde").
    C'est peut-être négligeable mais depuis le début tu parles de traiter des millions de fichiers, et là ce n'est plus négligeable.

    Dans tous les cas il est logique que ce soit plus performant de faire un traitement une seule fois au lieu de plusieurs (lorsque c'est possible bien sûr).





    Sinon pourquoi passer les PreparedStatement en attribut d'instance ?
    Il n'y a aucune raison à cela en plus de poser plusieurs soucis... dont l'absence de try-with-ressource (tu ne l'aime vraiment pas !)


    a++

  7. #47
    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
    Sinon pourquoi passer les PreparedStatement en attribut d'instance ?
    Il n'y a aucune raison à cela en plus de poser plusieurs soucis... dont l'absence de try-with-ressource (tu ne l'aime vraiment pas !)
    Là je ne te comprend VRAIMENT pas.. Tu peux me montrer ?..

    Jsuis désespéré... tempi je vais laisser tomber.
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  8. #48
    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
    Comme ca c'est bon pour le Writer ?

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    @Override
        public void parse(String path, Connection conn){
            try {
     
                conn.setAutoCommit(false);
     
                pstmtInsertInReferencesFilesTableDB = conn.prepareStatement("INSERT INTO ReferencesFiles (Name, URL, Signature, Checked) VALUES (?,?,?,?)");
                pstmtGetOldHashIfExist = conn.prepareStatement("SELECT Signature FROM ReferencesFiles WHERE URL=?");
                pstmtUpdateCheckedColumn = conn.prepareStatement("UPDATE ReferencesFiles SET Checked=1 WHERE URL=?");
                pstmtUpdateSignatureAndCheckedColumn = conn.prepareStatement("UPDATE ReferencesFiles SET Signature=?, Checked=1 WHERE URL=?");
     
                Writer reportingWriter = new FileWriter(Constants.REFERENCES_REPORTING_PATH, true);
                Writer loggigWriter = new FileWriter(Constants.LOGS_PATH, true);
     
                parseDirectory(path, conn, reportingWriter, loggigWriter);
     
                executeBatch(pstmtGetOldHashIfExist);
                executeBatch(pstmtInsertInReferencesFilesTableDB);
                executeBatch(pstmtUpdateCheckedColumn);
                executeBatch(pstmtUpdateSignatureAndCheckedColumn);
     
                pstmtInsertInReferencesFilesTableDB.close();
                pstmtGetOldHashIfExist.close();
                pstmtUpdateCheckedColumn.close();
                pstmtUpdateSignatureAndCheckedColumn.close();
     
                System.out.print("\n" + Constants.counter + "files found");
     
                conn.commit();
     
            } catch (Exception e) {
                System.out.println("Fatal error");
            }
        }
        @Override
        public void parseDirectory(String path, Connection conn, Writer reportingWriter, Writer loggigWriter) {
            File actual = new File(path);
            String actualPath;
            String actualName;
            String hash;
            String oldHash;
            try {
                for (File f : actual.listFiles()) {
                    actualPath = f.getAbsolutePath();
                    actualName = f.getName();
                    if (!f.getName().equals(".snapshot")) {
                        if (f.isDirectory()) {
                            parseDirectory(actualPath, conn, reportingWriter, loggigWriter);
                        } else {
                            Constants.counter++;
                            hash = Utils.HashUtils.hashFile(actualPath);
                            oldHash = getOldHashIfExist(actualPath, conn, pstmtGetOldHashIfExist);
     
                            if (oldHash != null) {
                                if (oldHash.equals(hash)) {
                                    updateCheckedColumn(actualPath, conn, pstmtUpdateCheckedColumn);
                                } else {
                                    Utils.ReportUtils.WriteInFile("Reference File MODIFIED : " + actualPath, reportingWriter);
                                    updateSignatureAndCheckedColumn(hash, actualPath, conn, pstmtUpdateSignatureAndCheckedColumn);
                                }
                            } else {
                                Utils.ReportUtils.WriteInFile("Reference File ADDED : " + actualPath, reportingWriter);
                                insertInReferencesFilesTableDB(actualName, actualPath, hash, conn, pstmtInsertInReferencesFilesTableDB);
                            }
                            System.out.print(".");
                            if (((Constants.counter) % 100) == 0) {
                                executeBatch(pstmtGetOldHashIfExist);
                                executeBatch(pstmtInsertInReferencesFilesTableDB);
                                executeBatch(pstmtUpdateCheckedColumn);
                                executeBatch(pstmtUpdateSignatureAndCheckedColumn);
                                System.out.print("\n" + Constants.counter + "files found");
                                conn.commit();
                            }
                        }
                    }
                }
            } catch (Exception e) {
                System.out.println("      Problem on " + path);
                Utils.ReportUtils.WriteInFile("Problem on " + path, loggigWriter);
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static final void WriteInFile(String lineToWrite, Writer writer) {
            try {
                writer.write(lineToWrite);
                writer.flush();
            } catch (IOException ioe) {
                ioe.printStackTrace();
                System.out.println("Impossible to write in file !");
            }
        }
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  9. #49
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Là je ne te comprend VRAIMENT pas.. Tu peux me montrer ?..
    Ben dans le code que tu donnais en page précédente, les PreparedStatement (pstmtInsertInReferencesFilesTableDB, pstmtGetOldHashIfExist, pstmtUpdateCheckedColumn et pstmtUpdateSignatureAndCheckedColumn) était déclaré en variable locale dans parseDirectory(), et c'était très bien comme cela (sauf que tu n'utilisais pas le try-with-ressource).


    Pourquoi les avoir passé en attribut d'instance dans ton dernier code ?


    Si tu ne veux pas avoir de merde avec les ressources, la base c'est d'utiliser le try-with-ressource.
    Dis-toi bien que dès que tu sors de là tu t'expose à des problèmes en tout genre...


    a++

  10. #50
    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
    Ben dans le code que tu donnais en page précédente, les PreparedStatement (pstmtInsertInReferencesFilesTableDB, pstmtGetOldHashIfExist, pstmtUpdateCheckedColumn et pstmtUpdateSignatureAndCheckedColumn) était déclaré en variable locale dans parseDirectory(), et c'était très bien comme cela (sauf que tu n'utilisais pas le try-with-ressource).
    Pourquoi les avoir passé en attribut d'instance dans ton dernier code ?
    Et bien parce que quand je trouve un dossier, je rappelle la méthode parseDirectory() donc du coup le preparedStatement serait recréer à chaque fois qu'il trouve un dossier, c'est déjà mieux qu'à chaque fichier, mais là au moins ils sont déclaré qu'une seule fois.. C'est un problème ?

    Sinon je peux les créer dans la methode parse() et mes passer en parametre de la methode parseDirectory() C'est mieux ?

    Et pour le Writer c'est correct ?

    Ps : Si tu en a marre de mon post je comprendrai très bien hein, c'est vraiment gentil de ta part, et je veux pas abuser non plus..
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  11. #51
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Comme ca c'est bon pour le Writer ?
    Hormis la remarque précédente sur les PreparedStatement, il manque encore les try-with-ressource.
    Mais bon ca fait juste 3 pages que j'en parle donc je vais laisser tomber libre à toi de faire comme bon te semble...


    Sinon des détails :
    • parseDirectory() devrait être déclaré en private, car on ne devrait pas l'appeler directement...
    • Tu fais un executeBatch sur pstmtGetOldHashIfExist, ce qui n'a pas de sens puisque c'est un SELECT...



    a++

  12. #52
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Sinon je peux les créer dans la methode parse() et mes passer en parametre de la methode parseDirectory() C'est mieux ?
    Oui car tu contrôle mieux leurs création/libération.
    Bref quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void parse(String path, Connection conn){
     
    	try (PreparedStatemet pstmtInsertInReferencesFilesTableDB = conn.prepareStatement("INSERT INTO ReferencesFiles (Name, URL, Signature, Checked) VALUES (?,?,?,?)");
    		pstmtGetOldHashIfExist = conn.prepareStatement("SELECT Signature FROM ReferencesFiles WHERE URL=?");
    		pstmtUpdateCheckedColumn = conn.prepareStatement("UPDATE ReferencesFiles SET Checked=1 WHERE URL=?");
    		pstmtUpdateSignatureAndCheckedColumn = conn.prepareStatement("UPDATE ReferencesFiles SET Signature=?, Checked=1 WHERE URL=?");
    		Writer reportingWriter = new FileWriter(Constants.REFERENCES_REPORTING_PATH, true);
    		Writer loggigWriter = new FileWriter(Constants.LOGS_PATH, true) ) {
     
     
    		parseDirectory(path, conn, pstmtInsertInReferencesFilesTableDB, pstmtGetOldHashIfExist,
    			pstmtUpdateCheckedColumn, pstmtUpdateSignatureAndCheckedColumn, reportingWriter, loggigWriter);
    	}
    }

    a++

  13. #53
    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
    Ah bah d'accord on peut en mettre plusieurs..
    Merci beacoup.
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  14. #54
    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
    Voilà ca à l'air bon comme ca nan ?

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
        @Override
        public void parse(String path, Connection conn) {
            try (
                    PreparedStatement pstmtInsertInReferencesFilesTableDB = conn.prepareStatement("INSERT INTO ReferencesFiles (Name, URL, Signature, Checked) VALUES (?,?,?,?)");
                    PreparedStatement pstmtGetOldHashIfExist = conn.prepareStatement("SELECT Signature FROM ReferencesFiles WHERE URL=?");
                    PreparedStatement pstmtUpdateCheckedColumn = conn.prepareStatement("UPDATE ReferencesFiles SET Checked=1 WHERE URL=?");
                    PreparedStatement pstmtUpdateSignatureAndCheckedColumn = conn.prepareStatement("UPDATE ReferencesFiles SET Signature=?, Checked=1 WHERE URL=?");
                    Writer reportingWriter = new FileWriter(Constants.REFERENCES_REPORTING_PATH, true);
                    Writer loggigWriter = new FileWriter(Constants.LOGS_PATH, true); ) {
     
                conn.setAutoCommit(false);
     
                parseDirectory(path, conn, reportingWriter, loggigWriter, pstmtInsertInReferencesFilesTableDB, pstmtGetOldHashIfExist, pstmtUpdateCheckedColumn, pstmtUpdateSignatureAndCheckedColumn);
     
                executeBatch(pstmtInsertInReferencesFilesTableDB);
                executeBatch(pstmtUpdateCheckedColumn);
                executeBatch(pstmtUpdateSignatureAndCheckedColumn);
     
                System.out.print("\n" + Constants.counter + "files found");
     
                conn.commit();
     
            } catch (Exception e) {
                System.out.println("Fatal error");
            }
        }
     
        @Override
        public void parseDirectory(String path, Connection conn, Writer reportingWriter, Writer loggigWriter, PreparedStatement pstmtInsertInReferencesFilesTableDB, PreparedStatement pstmtGetOldHashIfExist, PreparedStatement pstmtUpdateCheckedColumn, PreparedStatement pstmtUpdateSignatureAndCheckedColumn) {
            File actual = new File(path);
            String actualPath;
            String actualName;
            String hash;
            String oldHash;
            try {
                for (File f : actual.listFiles()) {
                    actualPath = f.getAbsolutePath();
                    actualName = f.getName();
                    if (!f.getName().equals(".snapshot")) {
                        if (f.isDirectory()) {
                            parseDirectory(actualPath, conn, reportingWriter, loggigWriter, pstmtInsertInReferencesFilesTableDB, pstmtGetOldHashIfExist, pstmtUpdateCheckedColumn, pstmtUpdateSignatureAndCheckedColumn);
                        } else {
                            Constants.counter++;
                            hash = Utils.HashUtils.hashFile(actualPath);
                            oldHash = getOldHashIfExist(actualPath, conn, pstmtGetOldHashIfExist);
     
                            if (oldHash != null) {
                                if (oldHash.equals(hash)) {
                                    updateCheckedColumn(actualPath, conn, pstmtUpdateCheckedColumn);
                                } else {
                                    Utils.ReportUtils.WriteInFile("Reference File MODIFIED : " + actualPath, reportingWriter);
                                    updateSignatureAndCheckedColumn(hash, actualPath, conn, pstmtUpdateSignatureAndCheckedColumn);
                                }
                            } else {
                                Utils.ReportUtils.WriteInFile("Reference File ADDED : " + actualPath, reportingWriter);
                                insertInReferencesFilesTableDB(actualName, actualPath, hash, conn, pstmtInsertInReferencesFilesTableDB);
                            }
                            System.out.print(".");
                            if (((Constants.counter) % 100) == 0) {
                                executeBatch(pstmtInsertInReferencesFilesTableDB);
                                executeBatch(pstmtUpdateCheckedColumn);
                                executeBatch(pstmtUpdateSignatureAndCheckedColumn);
                                System.out.print("\n" + Constants.counter + "files found");
                                conn.commit();
                            }
                        }
                    }
                }
            } catch (Exception e) {
                System.out.println("      Problem on " + path);
                Utils.ReportUtils.WriteInFile("Problem on " + path, loggigWriter);
            }
        }
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  15. #55
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sennad Voir le message
    Voilà ca à l'air bon comme ca nan ?
    Au niveau du code ca me semble bon oui.
    Après c'est à toi de tester...


    a++

  16. #56
    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
    Ok merci
    Je vais faire quelques tests
    Merci beaucoup et n'hésite pas à me dire stop si j'en demande trop ^^
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  17. #57
    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
    Bon bah ca a mis 4min aussi..
    Mon problème dois venir de la base de donnée, je vois que ça..
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  18. #58
    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
    Si tu as du mal à identifier l'origine des lenteurs, un profiler peut t'aider à identifier les parties de ton code qui posent problème... J'ai personnellement utilisé JProfiler qui était assez simple d'utilisation.

    Cela ne te permettra pas de résoudre les lenteurs, mais d'identifier où elles se trouvent. Ce genre d'outils est notamment assez fort pour detecter les requêtes SQL qui prennent du temps.

  19. #59
    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
    Si tu as du mal à identifier l'origine des lenteurs, un profiler peut t'aider à identifier les parties de ton code qui posent problème... J'ai personnellement utilisé JProfiler qui était assez simple d'utilisation.

    Cela ne te permettra pas de résoudre les lenteurs, mais d'identifier où elles se trouvent. Ce genre d'outils est notamment assez fort pour detecter les requêtes SQL qui prennent du temps.
    Salut, merci pour ta réponse.
    Je vais regarder ca, je connais pas du tout ^^
    Merci encore
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  20. #60
    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 ne vois rien de spécial, je n’ai pas l'impression qu'il y ai de problème particulier.
    Nom : Capture.PNG
Affichages : 114
Taille : 146,8 Ko

    Je pense vraiment que le problème vient de ma DB.
    Sans programme qui tourne, sans aucune requête ou quoi que ce soit, j'ai déjà le "innoDB buffer usage" à 87.5%.. :
    Nom : Capture3.PNG
Affichages : 126
Taille : 17,8 KoNom : Capture2.PNG
Affichages : 123
Taille : 63,2 Ko
    -----------------------------------------------------------------------------------------
    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