12
votes

Surveillance des progrès de l'analyseur Java Sax

J'écris un analyseur SAX en Java pour analyser un fichier XML de 2,5 Go d'articles Wikipedia. Y a-t-il un moyen de surveiller les progrès de l'analyse de Java?


0 commentaires

5 Réponses :


1
votes

En supposant que vous savez combien d'articles vous avez, vous ne pouvez pas simplement garder un comptoir dans le gestionnaire? Par exemple xxx

(je ne sais pas si vous analysez "article", c'est juste un exemple)

Si vous ne connaissez pas le nombre d'articles à l'avance , vous devrez le compter en premier. Ensuite, vous pouvez imprimer l'état NB Tags Lecture / Total NB NB des balises , disons chaque étiquette de 100 ( compteur% 100 == 0 ).

ou même avoir un autre thread surveillant les progrès. Dans ce cas, vous voudrez peut-être synchroniser l'accès au comptoir, mais pas nécessaire étant donné qu'il n'a pas besoin d'être vraiment précis.

Mes 2 cents


1 commentaires

Je l'ai compris, mais je cherchais un moyen de le faire sans avoir besoin de compter les articles en premier. Je pensais peut-être qu'il y avait un moyen de comprendre la position du parseur dans le dossier, car je peux facilement obtenir la taille du fichier.



2
votes

Vous pouvez obtenir une estimation de la ligne / colonne en cours de votre fichier en remplissant la méthode setingdocumentLocator de org.xml.sax.helpers.defaultandler / basehandler . Cette méthode est appelée avec un objet à partir de laquelle vous pouvez obtenir une approximation de la ligne / colonne en cours en cas de besoin.

Edit: Au meilleur de ma connaissance, il n'y a pas de moyen standard d'obtenir la position absolue. Cependant, je suis sûr que certaines implémentations de SAX offrent ce type d'informations.


2 commentaires

Fermer, mais je devrais alors connaître le nombre de lignes dans le fichier, non?


En effet. Une autre idée aurait pu pointer par l'EJP énigmatique. Vous pouvez estimer les progrès accomplis en utilisant l'avancement dans le flux d'entrée. Cependant, ce n'est pas la progrès dans l'analyse non plus, en raison de la mise en mémoire tampon et des lunettes de vue potentielles.



10
votes

Utilisez un javax.swing.ProgressMonitorInputStream.


2 commentaires

Je pense que cela sera assez proche. Merci!


Une réponse peut-elle être plus simple que cela ?! :)



0
votes

J'utiliserais la position de flux d'entrée. Faites votre propre classe de flux trivial qui déléguette / hérite du «réel» et de la lecture des octets. Comme vous le dites, l'obtention de la variation totale est facile. Je ne m'inquiéterais pas de la mise en mémoire tampon, de la lunette, etc. - pour les gros dossiers comme ceux-ci, c'est le poulet. D'autre part, je limiterais la position à "99%".


0 commentaires

11
votes

Merci à la suggestion d'EJP de ProgressMonitorInputStream code>, à la fin I étendue filtreInputtream code> de sorte que changelistener code> peut être utilisé pour surveiller l'emplacement de lecture actuel dans Terme des octets.

Avec cela, vous avez un contrôle plus fin, par exemple pour afficher plusieurs barres de progression pour la lecture parallèle des gros fichiers XML. Qui est exactement ce que j'ai fait. P>

Donc, une version simplifiée du flux surveillable: p> xxx pré>

Il ne se connaît pas - Le flux sous-jacent est, vous devez donc l'obtenir d'une autre manière, comme du dossier lui-même. P>

Donc, voici l'utilisation de l'échantillon simplifié: p>

try (
   MonitoredInputStream mis = new MonitoredInputStream(new FileInputStream(file), 65536*4) 
) {

   // Setup max progress and listener to monitor read progress
   progressBar.setMaxProgress( (int) file.length() ); // Swing thread or before display please
   mis.addChangeListener( new ChangeListener() { @Override public void stateChanged(ChangeEvent e) {
      SwingUtilities.invokeLater( new Runnable() { @Override public void run() {
         progressBar.setProgress( (int) mis.getProgress() ); // Promise me you WILL use MVC instead of this anonymous class mess! 
      }});
   }});
   // Start parsing. Listener would call Swing event thread to do the update.
   SAXParserFactory.newInstance().newSAXParser().parse(mis, this);

} catch ( IOException | ParserConfigurationException | SAXException e) {

   e.printStackTrace();

} finally {

   progressBar.setVisible(false); // Again please call this in swing event thread

}


1 commentaires

Excellent! Exactement ce que je cherchais, je vais adapter ça, merci! :)