54 votes

Formats de compression prenant en charge l’accès aléatoire dans les archives?

Ceci est similaire à une précédente question, mais les réponses ne satisfont pas à mes besoins et ma question est un peu différente:

Actuellement, je utiliser la compression gzip pour certains de très gros fichiers qui contiennent des données triées. Lorsque les fichiers ne sont pas compressés, binaire de recherche est un outil pratique et efficace pour soutenir la recherche d'un emplacement dans les données triées.

Mais lorsque les fichiers sont compressés, les choses deviennent difficiles. J'ai récemment découvert sur zlib's Z_FULL_FLUSH option, qui peut être utilisé lors de la compression d'insérer des "points de synchronisation" dans le comprimé de sortie (inflateSync() pouvez alors commencer la lecture à partir de différents points dans le fichier). C'est OK, mais les fichiers j'ai déjà devrait être recomprimé à l'ajout de cette fonctionnalité (et étrangement gzip n'est pas une option, mais je suis prêt à écrire mon propre programme de compression si je doit).

Il semble d'après une source que même Z_FULL_FLUSH n'est pas une solution parfaite...non seulement il n'est pas pris en charge par toutes les archives gzip, mais l'idée même de détecter les points de synchronisation dans les archives peut produire des faux positifs (soit en coïncidence avec le nombre magique pour les points de synchronisation, ou en raison du fait qu' Z_SYNC_FLUSH produit également des points de synchronisation, mais ils ne sont pas utilisables pour un accès aléatoire).

Est-il une meilleure solution? J'aimerais éviter d'avoir des fichiers auxiliaires pour l'indexation, si possible, et explicite, par défaut pour l'quasi-random access serait utile (même si c'est gros-grain--comme être en mesure de commencer à lire à chaque 10 MO d'intervalle). Est-il un autre format de compression avec un meilleur support pour les lectures aléatoires que gzip?

Edit: Comme je l'ai mentionné, je souhaite faire une recherche binaire à données compressées. Je n'ai pas besoin de demander à un particulier (non compressé) position--uniquement pour chercher à grossier de granularité dans le fichier compressé. Je viens de veulent de l'aide pour quelque chose comme "Décompresser les données de départ d'environ 50% (25% à 12,5%, etc.) dans ce fichier compressé."

32voto

Ivo Danihelka Points 1770

Jetez un oeil à dictzip. Il est compatible avec gzip et grossier permet un accès aléatoire.

Un extrait de sa page de manuel:

dictzip compresse les fichiers en utilisant le format gzip(1) de l'algorithme LZ77) d'une manière qui est entièrement compatible avec le gzip format de fichier. Une extension pour le gzip format de fichier (Champ Supplémentaire, décrit dans 2.3.1.1 de la RFC 1952) permet de données supplémentaires pour être stocké dans l'en-tête d'un fichier compressé. Des programmes comme gzip et zcat va ignorer ces données supplémentaires. Cependant, [dictzcat --start] pour utiliser de ces données pour effectuer des pseudo-aléatoire d'accès sur le fichier.

J'ai le forfait dictzip dans Ubuntu. Ou son code source est dans un dictd-*.tar.gz. Sa licence GPL. Vous êtes libre de les étudier.

Mise à jour:

J'ai amélioré dictzip ne pas avoir de limite de taille de fichier. Mon œuvre est sous licence MIT.

18voto

jpalecek Points 31928

Je ne sais pas du tout format de fichier compressé qui serait en charge de l'accès aléatoire à un emplacement spécifique dans les données non compressées (enfin, sauf pour les formats multimédias), mais vous pouvez préparer votre propre.

Par exemple, bzip2 fichiers compressés sont indépendants comprimé blocs de taille <1 MO non compressé, qui sont délimitées par des séquences de magie octets, de sorte que vous pourriez analyser le fichier bzip2, obtenir les limites des blocs et ensuite il suffit de décompresser le bloc de droite. Ce besoin d'un peu d'indexation de se rappeler d'où viennent les blocs de départ.

Pourtant, je pense que la meilleure solution serait de diviser un fichier en morceaux de votre choix, puis de le compresser avec certains archiveur, comme zip ou rar, qui prennent en charge l'accès aléatoire à des fichiers dans l'archive.

9voto

AardvarkSoup Points 488

L' .xz format de fichier (qui utilise la compression LZMA) semble soutenir ce:

Random-access lecture: Les données peuvent être divisés en indépendamment compressé blocs. Tous les .xz fichier contient un index de blocs, ce qui rend limitée random-access lecture possible lorsque la taille du bloc est assez petit.

Cela devrait être suffisant pour vos besoins. Un inconvénient est que les API de liblzma (pour interagir avec ces conteneurs) ne semble pas que le bien documenté, donc il peut prendre un certain effort de trouver comment accéder de manière aléatoire de blocs.

7voto

hippietrail Points 4257

Des solutions existent pour fournir un accès aléatoire aux archives gzip et bzip2:

( Je cherche quelque chose pour 7zip )

3voto

William Brendel Points 15453

Je ne sais pas si cela serait pratique dans votre situation exacte, mais ne pourriez-vous pas gzip chaque fichier volumineux en fichiers plus petits, par exemple 10 Mo chacun? Vous vous retrouveriez avec un tas de fichiers: file0.gz, file1.gz, file2.gz, etc. Sur la base d'un décalage donné dans le grand d'origine, vous pourriez rechercher dans le fichier nommé "file" + (offset / 10485760) + ".gz" . Le décalage dans l'archive non compressée serait de offset % 10485760 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X