예제 #1
0
        static void Main(string[] args)
        {
            var data = Encoding.ASCII.GetBytes("Hello World!");

            Console.WriteLine("SnappyCodec roundtrip: {0}", Encoding.ASCII.GetString(SnappyCodec.Uncompress(SnappyCodec.Compress(data))));

            var buffer = new MemoryStream();
            var stream = new SnappyStream(buffer, CompressionMode.Compress);

            stream.Write(data, 0, data.Length);
            stream.Close();
            buffer = new MemoryStream(buffer.ToArray());
            stream = new SnappyStream(buffer, CompressionMode.Decompress);
            var roundtrip = new byte[data.Length];
            int read      = stream.Read(roundtrip, 0, data.Length);

            if (read != data.Length)
            {
                throw new ApplicationException();
            }
            if (0 != stream.Read(roundtrip, 0, data.Length))
            {
                throw new ApplicationException();
            }
            Console.WriteLine("SnappyStream roundtrip: {0}", Encoding.ASCII.GetString(roundtrip));
        }
예제 #2
0
        public async Task CompressAndDecompressAsync(string filename)
        {
            using var resource =
                      typeof(SnappyStreamTests).Assembly.GetManifestResourceStream($"Snappier.Tests.TestData.{filename}");
            Assert.NotNull(resource);

            using var output = new MemoryStream();

            using (var compressor = new SnappyStream(output, CompressionMode.Compress, true))
            {
                await resource.CopyToAsync(compressor);
            }

            output.Position = 0;

            using var decompressor = new SnappyStream(output, CompressionMode.Decompress, true);

            using var streamReader = new StreamReader(decompressor, Encoding.UTF8);
            var decompressedText = await streamReader.ReadToEndAsync();

            _outputHelper.WriteLine(decompressedText);

            using var sourceResource = typeof(SnappyStreamTests).Assembly.GetManifestResourceStream($"Snappier.Tests.TestData.{filename}");
            Assert.NotNull(sourceResource);

            using var streamReader2 = new StreamReader(sourceResource, Encoding.UTF8);
            var sourceText = await streamReader2.ReadToEndAsync();

            Assert.Equal(sourceText, decompressedText);
        }
예제 #3
0
 public void stream_cannot_read_when_compressing()
 {
     using (var ms = new MemoryStream())
     {
         var target = new SnappyStream(ms, CompressionMode.Compress);
         Assert.False(target.CanRead);
     }
 }
예제 #4
0
 public void stream_can_read_when_decompressing()
 {
     using (var ms = new MemoryStream(new byte[] { 255, 115, 78, 97, 80, 112, 89, 0, 0, 0, 8, 0, 100, 0, 254, 1, 0, 130, 1, 0, 0 }))
     {
         var target = new SnappyStream(ms, CompressionMode.Decompress);
         Assert.True(target.CanRead);
     }
 }
예제 #5
0
 public void identifier_and_header_written_on_compression_construction()
 {
     var ms = new MemoryStream();
     using (var target = new SnappyStream(ms, CompressionMode.Compress, true, false))
     {
     }
     Assert.Equal(new byte[] {0xff, (byte)'s', (byte)'N', (byte)'a', (byte)'P', (byte)'p', (byte)'Y'}, ms.GetBuffer().Take((int) ms.Length));
 }
예제 #6
0
 public void underlying_stream_closed_on_dispose()
 {
     var ms = new MemoryStream();
     using (var target = new SnappyStream(ms, CompressionMode.Compress))
     {
     }
     Assert.Throws<ObjectDisposedException>(() => ms.Capacity);
 }
예제 #7
0
 public void underlying_stream_not_closed_when_contructor_says_no()
 {
     var ms = new MemoryStream();
     using (var target = new SnappyStream(ms, CompressionMode.Compress, true, false))
     {
     }
     Assert.True(ms.CanWrite && ms.CanRead);
 }
예제 #8
0
 public void stream_cannot_read_when_compressing()
 {
     using (var ms = new MemoryStream())
     {
         var target = new SnappyStream(ms, CompressionMode.Compress);
         Assert.False(target.CanRead);
     }
 }
예제 #9
0
 public void stream_can_read_when_decompressing()
 {
     using (var ms = new MemoryStream(new byte[] {255, 115, 78, 97, 80, 112, 89, 0, 0, 0, 8, 0, 100, 0, 254, 1, 0, 130, 1, 0, 0 }))
     {
         var target = new SnappyStream(ms, CompressionMode.Decompress);
         Assert.True(target.CanRead);
     }
 }
예제 #10
0
        public void Snappier()
        {
            _source.Position      = 0;
            _destination.Position = 0;
            using var stream      = new SnappyStream(_destination, CompressionMode.Compress, true);

            _source.CopyTo(_destination, ReadSize);
        }
예제 #11
0
        public void Snappier()
        {
            _memoryStream.Position = 0;
            using var stream       = new SnappyStream(_memoryStream, CompressionMode.Decompress, true);

            while (stream.Read(_buffer, 0, ReadSize) > 0)
            {
            }
        }
예제 #12
0
        public void underlying_stream_closed_on_dispose()
        {
            var ms = new MemoryStream();

            using (var target = new SnappyStream(ms, CompressionMode.Compress))
            {
            }
            Assert.Throws <ObjectDisposedException>(() => ms.Capacity);
        }
예제 #13
0
 public void stream_can_never_seek()
 {
     using (var ms = new MemoryStream())
     {
         Assert.True(ms.CanSeek);
         var target = new SnappyStream(ms, CompressionMode.Compress);
         Assert.False(target.CanSeek);
     }
 }
예제 #14
0
        public void identifier_and_header_written_on_compression_construction()
        {
            var ms = new MemoryStream();

            using (var target = new SnappyStream(ms, CompressionMode.Compress, true, false))
            {
            }
            Assert.Equal(new byte[] { 0xff, (byte)'s', (byte)'N', (byte)'a', (byte)'P', (byte)'p', (byte)'Y' }, ms.ToArray().Take((int)ms.Length));
        }
예제 #15
0
 public void stream_can_never_seek()
 {
     using (var ms = new MemoryStream())
     {
         Assert.True(ms.CanSeek);
         var target = new SnappyStream(ms, CompressionMode.Compress);
         Assert.False(target.CanSeek);
     }
 }
예제 #16
0
        public void underlying_stream_not_closed_when_contructor_says_no()
        {
            var ms = new MemoryStream();

            using (var target = new SnappyStream(ms, CompressionMode.Compress, true, false))
            {
            }
            Assert.True(ms.CanWrite && ms.CanRead);
        }
예제 #17
0
        byte[] GetCompressedFile(byte[] uncompressed)
        {
            var compressed = new MemoryStream();

            using (var compressor = new SnappyStream(compressed, CompressionMode.Compress, true))
                compressor.Write(uncompressed, 0, uncompressed.Length);
            compressed.Close();
            return(compressed.ToArray());
        }
예제 #18
0
        public void stream_write_throws_exception_on_chunk_length_too_long()
        {
            var ms = new MemoryStream();

            using (var target = new SnappyStream(ms, CompressionMode.Compress, true, false))
            {
                byte[] buffer = new byte[1 << 20];
                Assert.Throws <InvalidOperationException>(() => target.Write(buffer, 0, 1 << 20 + 1));
            }
        }
예제 #19
0
        public override byte[] Compress(byte[] uncompressedData)
        {
            var outStream = new MemoryStream();

            using (var compress = new SnappyStream(outStream, CompressionMode.Compress))
            {
                compress.Write(uncompressedData, 0, uncompressedData.Length);
            }
            return(outStream.ToArray());
        }
예제 #20
0
        public override byte[] Decompress(byte[] compressedData)
        {
            var inStream  = new MemoryStream(compressedData);
            var outStream = new MemoryStream();

            using (var decompress = new SnappyStream(inStream, CompressionMode.Decompress))
            {
                CopyTo(decompress, outStream);
            }
            return(outStream.ToArray());
        }
        public void Decompress(Stream input, Stream output)
        {
#if NET452 || NETSTANDARD2_0
            using (var snappyStream = new SnappyStream(input, CompressionMode.Decompress, true))
            {
                snappyStream.CopyTo(output);
            }
#else
            throw new NotSupportedException();
#endif
        }
예제 #22
0
        public void data_written_to_stream()
        {
            var ms = new MemoryStream();

            using (var target = new SnappyStream(ms, CompressionMode.Compress, true, false))
            {
                byte[] buffer = new byte[100];
                target.Write(buffer, 0, buffer.Length);
            }
            Assert.Equal(new byte[] { 255, 115, 78, 97, 80, 112, 89, 0, 0, 0, 8, 0, 100, 0, 254, 1, 0, 130, 1, 0, 0 }, ms.ToArray().Take((int)ms.Length));
        }
예제 #23
0
 public void UnCompress(string compressedFile, string destinationFile)
 {
     using (Stream source = File.OpenRead(compressedFile))
     {
         using (var decoder = new SnappyStream(source, CompressionMode.Decompress))
         {
             using (var file = new FileStream(destinationFile, FileMode.Create, FileAccess.Write))
             {
                 decoder.CopyTo(file);
             }
         }
     }
 }
예제 #24
0
 public void Compress(string sourceFile, string compressedFile)
 {
     using (Stream source = File.OpenRead(sourceFile))
     {
         using (var file = new FileStream(compressedFile, FileMode.Create, FileAccess.Write))
         {
             using (var compressor = new SnappyStream(file, CompressionMode.Compress))
             {
                 source.CopyTo(compressor);
             }
         }
     }
 }
        static void ProcessFile(Stream input, Stream output, Options options)
        {
            var buffer = new byte[8192];

            if (options.Mode == CompressionMode.Compress)
            {
                using (var compressor = new SnappyStream(output, CompressionMode.Compress, true))
                {
                    while (true)
                    {
                        int read = input.Read(buffer, 0, buffer.Length);
                        if (read == 0)
                        {
                            break;
                        }
                        compressor.Write(buffer, 0, read);
                    }
                }
            }
            else if (!options.Test)
            {
                using (var decompressor = new SnappyStream(input, CompressionMode.Decompress, true))
                {
                    while (true)
                    {
                        int read = decompressor.Read(buffer, 0, buffer.Length);
                        if (read == 0)
                        {
                            break;
                        }
                        output.Write(buffer, 0, read);
                    }
                }
            }
            else
            {
                using (var decompressor = new SnappyStream(input, CompressionMode.Decompress, true))
                {
                    while (true)
                    {
                        int read = input.Read(buffer, 0, buffer.Length);
                        if (read == 0)
                        {
                            break;
                        }
                    }
                }
            }
        }
예제 #26
0
        public void LoadToMemory()
        {
            _memoryStream = new MemoryStream();

            using var resource =
                      typeof(DecompressAll).Assembly.GetManifestResourceStream("Snappier.Benchmarks.TestData." + FileName);

            using var compressStream = new SnappyStream(_memoryStream, CompressionMode.Compress, true);

            // ReSharper disable once PossibleNullReferenceException
            resource.CopyTo(compressStream);
            compressStream.Flush();

            _buffer = new byte[65536];
        }
예제 #27
0
 public void AsyncDecompression(string name)
 {
     Benchmark.Run("Async-decompressing", name, benchmark =>
     {
         var stream       = new RepeaterStream(GetCompressedFile(benchmark.Input));
         var decompressor = new SnappyStream(stream, CompressionMode.Decompress);
         var decompressed = new byte[benchmark.Input.Length];
         benchmark.Stopwatch.Start();
         for (int i = 0; i < benchmark.Iterations; ++i)
         {
             ReadFullyAsync(decompressor, decompressed, 0, decompressed.Length).Wait();
         }
         benchmark.Stopwatch.Stop();
     });
 }
예제 #28
0
 public void AsyncCompression(string name)
 {
     Benchmark.Run("Async-compressing", name, benchmark =>
     {
         var stream     = new NullStream();
         var compressor = new SnappyStream(stream, CompressionMode.Compress);
         benchmark.Stopwatch.Start();
         for (int i = 0; i < benchmark.Iterations; ++i)
         {
             compressor.WriteAsync(benchmark.Input, 0, benchmark.Input.Length).Wait();
             compressor.FlushAsync().Wait();
         }
         benchmark.Stopwatch.Stop();
         benchmark.Note = String.Format(" ({0:0.00 %})", stream.Written / (double)benchmark.Input.Length / benchmark.Iterations);
     });
 }
예제 #29
0
 static void Main(string[] args)
 {
     try
     {
         var folder = Path.Combine(Path.GetTempPath(), "Snappy.NET-" + "XXX");
         Console.WriteLine($"Temp folder: {folder}");
         var file       = File.OpenWrite("mydata.sz");
         var compressor = new SnappyStream(file, CompressionMode.Compress);
         var writer     = new StreamWriter(compressor);
         writer.WriteLine("Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!");
         writer.Close();
         var data = File.ReadAllBytes("mydata.sz");
         Console.WriteLine($"Length: {data.Length}");
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
     }
 }
예제 #30
0
        public static PositionTrackingStream CreateWriter(
            Stream nakedStream, CompressionMethod compressionMethod)
        {
            Stream dest = nakedStream;

            switch (compressionMethod)
            {
            case CompressionMethod.Gzip:
                dest = new GZipStream(dest, CompressionLevel.Optimal, false);
                break;

            case CompressionMethod.Snappy:
                dest = new SnappyStream(dest, CompressionMode.Compress, false, false);
                break;

            case CompressionMethod.None:
                break;

            default:
                throw new NotImplementedException();
            }

            return(new PositionTrackingStream(dest));
        }
예제 #31
0
 public void stream_write_throws_exception_on_chunk_length_too_long()
 {
     
     var ms = new MemoryStream();
     using (var target = new SnappyStream(ms, CompressionMode.Compress, true, false))
     {
         byte[] buffer = new byte[1 << 20];
         Assert.Throws<InvalidOperationException>(() => target.Write(buffer, 0, 1 << 20)); 
     }
 }
예제 #32
0
 public void data_written_to_stream()
 {
     var ms = new MemoryStream();
     using (var target = new SnappyStream(ms, CompressionMode.Compress, true, false))
     {
         byte[] buffer = new byte[100];
         target.Write(buffer, 0, buffer.Length); 
     }
     Assert.Equal(new byte[] { 255, 115, 78, 97, 80, 112, 89, 0, 0, 0, 8, 0, 100, 0, 254, 1, 0, 130, 1, 0, 0 }, ms.GetBuffer().Take((int) ms.Length));
 }
예제 #33
0
        public void Twister()
        {
            var  testdata  = Directory.GetFiles(Benchmark.DataPath).Select(f => File.ReadAllBytes(f)).ToArray();
            long totalData = 0;
            var  stopwatch = new Stopwatch();

            stopwatch.Start();
            while (stopwatch.Elapsed < TimeSpan.FromSeconds(3))
            {
                int count    = Random.Next(0, 21);
                var sequence = Enumerable.Range(0, count).Select(n => testdata[Random.Next(testdata.Length)]).ToArray();
                totalData += sequence.Sum(f => f.Length);
                var stream = new RandomChunkStream();
                ManualResetEvent doneReading = new ManualResetEvent(false);
                ThreadPool.QueueUserWorkItem(ctx =>
                {
                    try
                    {
                        using (var decompressor = new SnappyStream(stream, CompressionMode.Decompress))
                        {
                            foreach (var file in sequence)
                            {
                                var decompressed = new byte[file.Length];
                                if (decompressed.Length < 500)
                                {
                                    for (int i = 0; i < decompressed.Length; ++i)
                                    {
                                        decompressed[i] = checked ((byte)decompressor.ReadByte());
                                    }
                                }
                                else
                                {
#if SNAPPY_ASYNC
                                    if (ReadRandom.Next(2) == 0)
                                    {
                                        ReadAllAsync(decompressor, decompressed, 0, decompressed.Length).Wait();
                                    }
                                    else
#endif
                                    ReadAll(decompressor, decompressed, 0, decompressed.Length);
                                }
                                CheckBuffers(file, decompressed);
                            }
                            Assert.AreEqual(-1, decompressor.ReadByte());
                        }
                        doneReading.Set();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Read thread failed: {0}", e);
                        throw;
                    }
                });
                using (var compressor = new SnappyStream(stream, CompressionMode.Compress))
                {
                    foreach (var file in sequence)
                    {
                        if (file.Length < 500)
                        {
                            for (int i = 0; i < file.Length; ++i)
                            {
                                compressor.WriteByte(file[i]);
                            }
                        }
                        else
                        {
#if SNAPPY_ASYNC
                            if (WriteRandom.Next(2) == 0)
                            {
                                compressor.WriteAsync(file, 0, file.Length).Wait();
                            }
                            else
#endif
                            compressor.Write(file, 0, file.Length);
                        }
                        if (WriteRandom.Next(10) == 0)
                        {
#if SNAPPY_ASYNC
                            if (WriteRandom.Next(2) == 0)
                            {
                                compressor.FlushAsync().Wait();
                            }
                            else
#endif
                            compressor.Flush();
                        }
                    }
#if SNAPPY_ASYNC
                    if (WriteRandom.Next(3) == 0)
                    {
                        compressor.FlushAsync().Wait();
                    }
                    else
#endif
                    {
                        if (WriteRandom.Next(2) == 0)
                        {
                            compressor.Flush();
                        }
                    }
                }
                doneReading.WaitOne();
            }
            stopwatch.Stop();
            Console.WriteLine("Ran {0} MB through the stream, that's {1:0.0} MB/s", totalData / 1024 / 1024, totalData / stopwatch.Elapsed.TotalSeconds / 1024 / 1024);
        }