Lecture fichier zip efficacement en Java
Je travaille sur un projet qui fonctionne sur une très grande quantité de données.
J'ai beaucoup(en milliers) des fichiers zip, contenant chacun UN simple fichier txt avec des milliers de lignes(environ 80 lignes).
Ce que je suis en train de faire est la suivante:
for(File zipFile: dir.listFiles()){
ZipFile zf = new ZipFile(zipFile);
ZipEntry ze = (ZipEntry) zf.entries().nextElement();
BufferedReader in = new BufferedReader(new InputStreamReader(zf.getInputStream(ze)));
...
De cette façon, je peux lire le fichier ligne par ligne, mais il est définitivement trop lent.
Étant donné le grand nombre de fichiers, et que les lignes doivent être lus, j'ai besoin de les lire de manière plus efficace.
J'ai regardé pour une approche différente, mais je n'ai pas été en mesure de trouver quoi que ce soit.
Ce que je pense que je devrais utiliser sont le java nio Api destinées à droite intensifs, les opérations d'e/S, mais je ne sais pas comment les utiliser avec les fichiers zip.
Toute aide serait vraiment appréciée.
Merci,
Marco
/dev/null
?Vous devez d'abord déterminer si la plupart de votre temps est consacré à la lecture de fichiers zip, ou de traitement de l'lignes de texte. Que faites-vous avec chaque ligne dans les fichiers texte?
Les fichiers zippés sont d'environ 30 MO chacune, tandis que le txt à l'intérieur du fichier zip est d'environ 60/70 MO. La taille et le nombre de lignes ne sont pas fixes, ils peuvent changer, mais théoriquement, ils devraient toujours être similaire en taille et en nombre de lignes. Lire et traiter les fichiers avec ce code prend beaucoup d'heures, autour de 15, mais ça dépend de beaucoup de facteurs.
Je suggère qu'elle est le traitement qui prend le temps ici. Vous avez besoin de mesurer. Essayez juste de la lecture de la première partie, sans aucun traitement.
vous faites l'erreur classique de penser que le nio Api de rendre votre code plus rapide. le nio Api peuvent rendre votre code plus évolutive gestion de plusieurs flux w/ moins de threads, mais cela ne signifie pas nécessairement faire des choses rapide.
OriginalL'auteur smellyarmpits | 2012-05-24
Vous devez vous connecter pour publier un commentaire.
Faisons un peu le dos de l'enveloppe-calculs.
Disons que vous avez 5000 fichiers. Si il est 15 heures, ce qui équivaut à ~10 secondes par fichier. Les fichiers sont à environ 30 MO chacun, de sorte que le débit est d'environ 3 MO/s.
C'est entre un et deux ordres de grandeur plus lent que le taux de
ZipFile
peut décompresser les choses.Soit il y a un problème avec les disques (sont-ils en local, ou sur un partage réseau?), ou c'est le traitement qui prend la plupart du temps.
La meilleure façon de s'en assurer est d'utiliser un profiler.
OriginalL'auteur NPE
Le bon moyen pour parcourir un fichier zip
Fichier Zip comprend plusieurs entrées, chacun d'eux a un champ contenant le nombre d'octets dans le courant d'entrée. Donc, il est facile pour itérer tous les zip les entrées du fichier sans données réelles de décompression. java.util.zip.ZipFile accepte un fichier/nom de fichier et utilise l'accès aléatoire à sauter d'un fichier de positions. java.util.zip.ZipInputStream, d'autre part, est de travailler avec des courants d'eau, ainsi qu'il est incapable de sauter librement. C'est pourquoi elle est à lire et à décompresser tous les colliers de données afin d'atteindre des expressions du FOLKLORE pour chaque entrée et de lire la prochaine entrée d'en-tête.
Ça veut dire quoi? Si vous avez déjà un fichier zip dans votre système de fichiers – utiliser ZipFile de processus, quelle que soit votre tâche. Comme un bonus, vous pouvez accéder à zip entrées, soit de manière séquentielle ou aléatoire (avec plutôt petite perte de performance). D'autre part, si vous êtes de traitement d'un flux de données, vous aurez besoin de traiter toutes les entrées de l'ordre à l'aide ZipInputStream.
Ici est un exemple. Une archive zip (total taille du fichier = 1,6 Go) contenant trois 0.6 Go entrées a été réitéré dans de 0,05 sec à l'aide de ZipFile et 18 sec à l'aide de ZipInputStream.
OriginalL'auteur Wasim Wani
Vous pouvez utiliser le nouveau fichier API comme ceci:
Le code pour les fichiers jar, mais je pense que cela devrait fonctionner pour fermetures à glissière.
? L'OP explicitement demandé un "java nio Api". Sur la deuxième pensée, l'OP peut être cherché un java.nio.les canaux d'approche, pas de java.nio.fichier, si.
J'ai mis à jour mon exemple de l'utilisation de la java.nio.les canaux de l'API. Je n'ai pas fait d'analyse de la performance, cependant, et ne sais pas si cela peut aider dans ce cas. Cela dit, java.nio.fichier est le préféré de l'API en Java SE 7.
OriginalL'auteur Puce
Vous pouvez essayer ce code
ce code fonctionne en bonne intelligence.
OriginalL'auteur satheesh kumar
Intel a fait une version améliorée de zlib, Java utilise en interne peroform zip/unzip. Elle vous demande de patch zlib sources avec Interl de IPP paches.
J'ai fait un référence montrant 1,4 x à 3x gains en termes de débit.
OriginalL'auteur milan