> Tech > Exemples de projets de compression

Exemples de projets de compression

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Vous pouvez télécharger trois exemples de projets .NET à partir du site Web SQL Server Magazine (http:// www.itpro.fr, Club Abonnés), afin de voir comment employer l’espace de noms System.IO.Compression pour compresser et décompresser des données au sein de SQL Server 2005 ou dans une application Windows Forms standard. Ces exemples

s’appuient sur la base de données AdventureWorks car elle contient des données se prêtant parfaitement au test de compression. La table Document dans le schéma Production comporte des documents Word non compressés stockés dans la colonne Document, laquelle a le type de données varbinary(max).

Pour que le premier exemple de projet demeure simple, nous n’avons pas effectué d’accès à la base de données. Le programme est une simple application Windows Forms qui vous permet de récupérer un fichier, de spécifier une méthode de compression et d’afficher le pourcentage de la compression en question. L’application affiche également le temps écoulé pour comprimer le fichier et le temps nécessaire pour le décompresser, comme l’illustre la figure 1.

Dans la mesure où les processus de compression et de décompression des données au moyen de Deflate- Stream et de GZipStream sont identiques, vous pouvez encapsuler la logique pour les deux algorithmes de compression dans la même sous-routine ou fonction. Comme le montre le listing 1, la classe CompressWrapper contient les méthodes Compress et Decompress, les deux ayant un paramètre permettant de choisir l’algorithme de compression. Le code de compression doit copier un flux non compressé vers un flux compressé et le code de décompression doit copier un flux compressé vers un flux décompressé. Vous pouvez encapsuler ces deux opérations de copie de flux dans une seule fonction générique. (Pour une version C# de Compress Wrapper, consultez le listing Web 1 à l’adresse http://www.itpro.fr, Club Abonnés).

Vous noterez, dans le bloc A du listing 1, que la méthode CopyStream accepte les objets Stream en tant que paramètres. Comme les deux classes DeflateStream et GZipStream héritent de la classe Stream, elles sont du type Stream. Lorsque les objets de flux DeflateStream et GZipStream sont instanciés, le deuxième paramètre du constructeur indique si le flux contiendra des données compressées ou décompressées. Lorsque votre application passe des objets Stream en paramètres à une méthode, vous pouvez appeler les méthodes Read et Write de ces objets à partir de la méthode, ce que fait CopyStream. Si, par exemple, un objet Stream non compressé se trouve dans le paramètre d’entrée et si le paramètre de sortie est un objet GZipStream, CopyStream utilise la méthode Read de l’objet Stream non compressé pour obtenir un bloc de données non compressées du flux d’entrée. L’application emploie alors la méthode Write de l’objet Stream compressé pour compresser le bloc et transférer les données résultantes dans le flux de sortie GZip Stream. D’une manière similaire, si un objet GZipStream est le paramètre d’entrée et si un objet Stream non compressé est le paramètre de sortie, Copy- Stream utilise la méthode Read de l’objet Stream compressé pour obtenir un bloc de données compressées et le décompresser. L’application emploie ensuite la méthode Write de l’objet Stream compressé afin de transférer le bloc décompressé dans le flux de sortie décompressé. Copy- Stream se sert d’une boucle pour appeler les méthodes Read et Write dans les blocs, de sorte qu’il est inutile de spécifier le nombre total d’octets à compresser ou décompresser.

Maintenant que nous avons vu l’approche de base de la compression et de la décompression, l’étape suivante consiste à créer un projet SQL Server et à exécuter la classe CompressWrapper dans le SQLCLR, ce qu’illustre notre deuxième exemple de projet. (Pour plus d’informations sur l’écriture et le déploiement de code CLR dans SQL Server 2005, consultez l’article « Le meilleur du CLR », Supplément SQL Server Magazine, juin 2005). Dans l’Explorateur de solutions (Solution Explorer), cliquez avec le bouton droit de la souris sur le projet SQL Server et sélectionnez Add, New Item dans le menu contextuel. Plusieurs modèles d’objet de base de données sont disponibles. Cliquez sur User-Defined Function. Visual Studio créera une classe avec les instructions Imports nécessaires et un exemple de fonction scalaire. Avant de modifier cette classe, ajoutez notre classe enveloppe de compression (CompressWrapper.vb) au projet en cliquant sur Add, Existing Item. Comme indiqué précédemment, cette classe encapsule la logique de compression/décompression en vue de sa réutilisation. Vous allez peut-être penser que pour bénéficier d’une véritable réutilisabilité, vous devez compiler cette classe dans un assembly distinct et vous aurez parfaitement raison. Ceci étant dit, l’utilisation d’assemblys personnalisés dans un projet SQL Server requiert un peu plus de configuration (Consultez l’encadré Web « Can I have a Reference ? », http://www.itpro.fr, Club Abonnés, pour avoir des conseils sur le référencement d’assemblys .NET personnalisés.) Par conséquent, nous avons décidé d’en rester à la réutilisation au niveau classe. Importez CompressWrapper.vb dans votre fichier de classe de fonction et ajoutez les deux appels de fonction SQL illustrés sur le listing 2. (Pour une version C# de ces fonctions définies par l’utilisateur, consultez le listing Web 3.) Déployez le projet au moyen de l’option Deploy de Visual Studio 2005.

Téléchargez cette ressource

Guide inmac wstore pour l’équipement IT de l’entreprise

Guide inmac wstore pour l’équipement IT de l’entreprise

Découvrez toutes nos actualités à travers des interviews, avis, conseils d'experts, témoignages clients, ainsi que les dernières tendances et solutions IT autour de nos 4 univers produits : Poste de travail, Affichage et Collaboration, Impression et Infrastructure.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010