snappier

Cómo usar la compresión Snappy en C# con Snappier

Snappier es una biblioteca de código abierto que implementa el algoritmo de compresión Snappy en C#, para su uso en aplicaciones de .NET.

Snappy es un algoritmo de compresión desarrollado en C++ por Google, que destaca por su velocidad y eficiencia, y bajo consumo de CPU y memoria.

A diferencia de otros algoritmos de compresión, como Gzip, Snappy está orientado a aplicaciones en las que la velocidad es crítica, como en sistemas de almacenamiento en caché y procesamiento en tiempo real.

Entre las muchas alternativas que hay para usar Snappy en .NET, a mi me gusta la librería Snappier. A diferencia de, por ejemplo, https://github.com/robertvazan/snappy.net, que es un wrapper entorno a la librería en C++, Snappier es un port completo a C#.

Al ser un port a full managed, nos aseguramos de que no vamos a tener fugas de memorias, o “errores raros” que pueden pasar cuando usamos Wrappers. Además, de que podemos usarlo en multiplataforma, no solo en Windows.

Por otro lado, está altamente optimizada. La velocidad que obtendremos con Snappier es similar a la que obtendríamos al usar la librería de C++ directamente. Especialmente importante, si tenemos en cuenta que el objetivo de Snappy es la velocidad.

Snappier es compatible con .NET Framework 4.6.1 o posterior, y .NET Core 2.0 o posterior. Pero solo en el caso de usar NET 3.0 o posterior, obtendremos un rendimiento es similar al conseguido en C++.

Cómo usar Snappier

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package Snappier

Aquí tenemos un ejemplo sencillo de cómo usar Snappier, extraído de la documentación de la librería

byte[] data = {0, 1, 2}; 

// Ejemplo compresión
byte[] compressed = Snappy.CompressToArray(data);

// Ejemplo de descompresión
 byte[] decompressed = Snappy.DecompressToArray(compressed);

Aunque lo normal es que usemos Streams, para optimizar el rendimiento. Así tenemos un ejemplo de como usar Snappier con Streams,

using var fileStream = File.OpenRead("somefile.txt");

// Ejemplo de compresión
using var compressed = new MemoryStream();
using (var compressor = new SnappyStream(compressed, CompressionMode.Compress, false)) {
	await fileStream.CopyToAsync(compressor);
}

// Ejemplo de descompresión
compressed.Position = 0;
using var decompressor = new SnappyStream(compressed, CompressionMode.Decompress);
var buffer = new byte[65536];
var bytesRead = decompressor.Read(buffer, 0, buffer.Length);
while (bytesRead > 0)
{
	bytesRead = decompressor.Read(buffer, 0, buffer.Length)
}

Como vemos, solo hace falta unos pocas líneas de código para comprimir y descomprimir datos con el algoritmo Snappy, de forma rápida y eficiente.