Java E / S consomme plus de ressources CPU

voix
0

Je suis en train de créer 100 fichiers à l'aide FileOutputStream / BufferedOutputStream. Je peux voir l'utilisation du processeur est 100% pendant 5 à 10 secondes. Le répertoire que je suis en train d'écrire est vide. Je crée des fichiers PDF à travers iText. Chaque fichier ayant 1 tour MB. Je fonctionne sur Linux.

Comment puis-je réécrire le code afin que je puisse minimiser l'utilisation du processeur?

Créé 27/08/2009 à 03:05
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
4

Est-ce dans un répertoire qui contient déjà un grand nombre de fichiers? Si oui, vous pourriez bien être juste de voir la peine d'avoir un grand nombre de fichiers dans un répertoire - cela varie considérablement selon le système d'exploitation et système de fichiers.

Sinon, qu'est - ce que vous faites en fait pendant que vous créez les fichiers? D' où proviennent les données? Sont - ils de gros fichiers? Une chose que vous pouvez faire est d' essayer d' écrire à la ByteArrayOutputStreamplace - de cette façon vous pouvez voir à quel point l'activité est due au système de fichiers et combien est juste la façon dont vous obtenir / écriture des données.

Créé 27/08/2009 à 03:10
source utilisateur

voix
0

Vous avez peu de chances d'être en mesure de réduire la charge du processeur pour votre tâche, en particulier sur un système Windows. Java sur Linux supporte fichier Asynchronous I / O, cependant, cela peut sérieusement compliquer votre code. Je suppose que vous utilisez Windows, sous forme de fichier E / S prend généralement beaucoup plus de temps sur Windows que sur Linux il fait. J'ai même entendu parler d'améliorations en exécutant Java dans un linux VM sur Windows.

Jetez un oeil à votre Gestionnaire des tâches lorsque le processus est en cours d' exécution et allumez Afficher noyau temps . Le temps CPU passé dans l' espace utilisateur peut généralement être optimisé, mais le temps CPU dans l' espace du noyau peut être généralement réduire de faire des appels plus efficaces.

  • Mettre à jour -

JSR 203 traite spécifiquement de la nécessité d' une asynchrone, multiplexé, scatter / gather fichier IO:

Le multiplex, installation non bloquante introduite par JSR-51 a résolu une grande partie de ce problème pour les sockets réseau, mais il ne l'a pas fait pour les opérations du système de fichiers.

Jusqu'à ce JSR-203 fait partie de Java, vous pouvez obtenir vrai IO asynchrone avec l' Apache MINA projet sur Linux.

Java NIO (1) vous permet de faire des E / S canal. Ceci est une amélioration des performances, mais vous faites seulement une mémoire tampon de données à la fois, et pas vrai async et IO multiplexé.

Créé 27/08/2009 à 03:15
source utilisateur

voix
2

Il est une supposition long shot, mais même si vous utilisez des flux tamponnés assurez-vous que vous n'êtes pas d'écrire un seul octet à la fois.

Les .read(int)et .write(int)méthodes sont des tueurs de CPU. Vous devez utiliser .read(byte[]...)et .write(byte[], int, int)pour certains.

Créé 27/08/2009 à 03:45
source utilisateur

voix
8

Ne pas deviner: le profil de votre application.

Si les chiffres montrent que beaucoup de temps est passé à / dans les appels d'écriture, puis regardez façons de le faire plus vite E / S. Mais si la plupart du temps est passé dans le formatage des choses pour la sortie (par exemple le rendu iText), alors c'est où vous devez concentrer vos efforts.

Créé 27/08/2009 à 04:07
source utilisateur

voix
0

Un fichier de 1Mo à écrire est assez grand pour utiliser un java.nioFileChannel et voir de grandes améliorations du rendement java.io. Ressaisissez votre code, et mesurer agaist les vieux trucs. Je prédis une amélioration de 2x, au minimum.

Créé 27/08/2009 à 12:19
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more