Pour Compresser un gros fichier dans un ZIP avec Java
J'ai le besoin de compresser un Gros fichier (~450 Mo) par le biais de la classe Java ZipOutputStream. Cette grande dimension sont les causes d'un problème de dépassement de mémoire" erreur de ma Segment de la JVM de l'Espace. Cela se produit parce que le "zos.écrire(...)" méthode stocke le contenu du fichier pour le compresser en interne tableau d'octets avant de le compresser.
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(filePath);
zos.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1)
{
zos.write(data, 0, count);
}
origin.close();
La solution naturelle sera pour agrandir le tas de l'espace mémoire de la JVM, mais je voudrais savoir si il existe une méthode pour écrire des données dans un streaming. Je n'ai pas besoin d'un taux de compression élevé pour que je puisse changer l'algorithme de trop.
quelqu'un a une idée à ce sujet?
Comme je l'ai écrit 2048
OriginalL'auteur robob | 2009-11-20
Vous devez vous connecter pour publier un commentaire.
En fonction de votre commentaire Sam réponse, vous avez évidemment créé un ZipOutputStream, qui encapsule un ByteArrayOutputStream. Le ByteArrayOutputStream de cours met en cache le résultat compressé en mémoire. Si vous voulez qu'il écrit sur le disque, vous devez envelopper la ZipOutputStream autour d'un FileOutputStream.
+1, l'utilisation d'un FileOutputStream pour écrire le zip sur le disque, ou si vous voulez le lire directement sur le navigateur utiliser le HttpServletResponse outputStream.
Lorsque 60 Mo soufflé de mémoire avez-vous été à l'aide de la JVM par défaut les paramètres? Si oui, alors que les sons sur la droite. Même si votre JVM est en cours d'exécution à 64 M de taille de segment de mémoire à un certain point le ByteArrayOutputStream aurez besoin pour développer cette byte[] tableau... ce qui signifie une copie complète.
OriginalL'auteur jarnbjo
Il y a une bibliothèque appelée TrueZip que j'ai utilisé avec succès dans le passé pour faire ce genre de chose.
Je ne peux pas garantir qu'elle fait mieux sur la mise en mémoire tampon avant. Je sais qu'il fait beaucoup de choses avec son propre code, plutôt que selon le JDK Postal de l'API.
Alors, il vaut la peine d'essayer, à mon avis.
OriginalL'auteur Carl Smotricz
ZipOutputStream est basée sur les flux, il ne tient pas sur la mémoire. Votre TAMPON peut être trop grande.
OriginalL'auteur Sam Barnum
Je me demande si c'est parce que vous êtes à stocker le contenu dans un ZipEntry, peut-être essentiellement des charges de l'ensemble de son contenu avant d'écrire le ZipEntry. Avez-vous d'utiliser Zip? Si c'est juste un flux de données, vous devez compresser vous devriez regarder dans le GZIPOutputStream à la place. Je crois qu'il n'aurait pas le même problème.
Espère que cette aide.
Sonne comme une mauvaise idée si vous avez de tels objets volumineux dans votre réponse. Envisager un retour à une URL au lieu de l'endroit où le fichier zip peut être récupéré. Plaine les servlets permettent un octet de la diffusion de la réponse.
vous avez raison, je pense que c'est le bon choix pour obtenir.
OriginalL'auteur cjstehno