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? P>
5 Réponses :
En supposant que vous savez combien d'articles vous avez, vous ne pouvez pas simplement garder un comptoir dans le gestionnaire? Par exemple (je ne sais pas si vous analysez "article", c'est juste un exemple) p> Si vous ne connaissez pas le nombre d'articles à l'avance , vous devrez le compter en premier. Ensuite, vous pouvez imprimer l'état 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. p> Mes 2 cents p> p> NB Tags Lecture / Total NB NB des balises CODE>, disons chaque étiquette de 100 (
compteur% 100 == 0 code>). p>
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.
Vous pouvez obtenir une estimation de la ligne / colonne en cours de votre fichier en remplissant la méthode 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. P> setingdocumentLocator code> de
org.xml.sax.helpers.defaultandler / basehandler code>. 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. P>
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.
Utilisez un javax.swing.ProgressMonitorInputStream. code> p>
Je pense que cela sera assez proche. Merci!
Une réponse peut-elle être plus simple que cela ?! :)
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%". P>
Merci à la suggestion d'EJP de 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> 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> 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.
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
}
Excellent! Exactement ce que je cherchais, je vais adapter ça, merci! :)