示例#1
0
        public void CompressionImprovesWithDictionary()
        {
            var dict = TrainDict();
            var compressionOptions = new CompressionOptions(dict);

            var dataStream = DataGenerator.GetSmallStream(DataFill.Sequential);

            var normalResultStream = new MemoryStream();

            using (var compressionStream = new CompressionStream(normalResultStream))
                dataStream.CopyTo(compressionStream);

            dataStream.Seek(0, SeekOrigin.Begin);

            var dictResultStream = new MemoryStream();

            using (var compressionStream = new CompressionStream(dictResultStream, compressionOptions))
                dataStream.CopyTo(compressionStream);

            Assert.Greater(normalResultStream.Length, dictResultStream.Length);

            dictResultStream.Seek(0, SeekOrigin.Begin);

            var resultStream = new MemoryStream();

            using (var decompressionStream = new DecompressionStream(dictResultStream, new DecompressionOptions(dict)))
                decompressionStream.CopyTo(resultStream);

            Assert.AreEqual(dataStream.ToArray(), resultStream.ToArray());
        }
示例#2
0
        public void RoundTrip_StreamingToStreaming_Stress([Values(true, false)] bool useDict, [Values(true, false)] bool async)
        {
            long i    = 0;
            var  dict = useDict ? TrainDict() : null;
            var  compressionOptions   = new CompressionOptions(dict);
            var  decompressionOptions = new DecompressionOptions(dict);

            Enumerable.Range(0, 10000)
            .AsParallel()
            .WithDegreeOfParallelism(Environment.ProcessorCount * 4)
            .ForAll(n =>
            {
                var testStream = DataGenerator.GetSmallStream(DataFill.Sequential);
                var cBuffer    = new byte[1 + (int)(n % (testStream.Length * 11))];
                var dBuffer    = new byte[1 + (int)(n % (testStream.Length * 13))];

                var tempStream = new MemoryStream();
                using (var compressionStream = new CompressionStream(tempStream, compressionOptions, 1 + (int)(n % (testStream.Length * 17))))
                {
                    int bytesRead;
                    int offset = n % cBuffer.Length;
                    while ((bytesRead = testStream.Read(cBuffer, offset, cBuffer.Length - offset)) > 0)
                    {
                        if (async)
                        {
                            compressionStream.WriteAsync(cBuffer, offset, bytesRead).GetAwaiter().GetResult();
                        }
                        else
                        {
                            compressionStream.Write(cBuffer, offset, bytesRead);
                        }
                        if (Interlocked.Increment(ref i) % 100 == 0)
                        {
                            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
                        }
                    }
                }

                tempStream.Seek(0, SeekOrigin.Begin);

                var resultStream = new MemoryStream();
                using (var decompressionStream = new DecompressionStream(tempStream, decompressionOptions, 1 + (int)(n % (testStream.Length * 19))))
                {
                    int bytesRead;
                    int offset = n % dBuffer.Length;
                    while ((bytesRead = async ? decompressionStream.ReadAsync(dBuffer, offset, dBuffer.Length - offset).GetAwaiter().GetResult() : decompressionStream.Read(dBuffer, offset, dBuffer.Length - offset)) > 0)
                    {
                        resultStream.Write(dBuffer, offset, bytesRead);
                        if (Interlocked.Increment(ref i) % 100 == 0)
                        {
                            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
                        }
                    }
                }

                Assert.AreEqual(testStream.ToArray(), resultStream.ToArray());
            });
            GC.KeepAlive(compressionOptions);
            GC.KeepAlive(decompressionOptions);
        }
示例#3
0
        public void CompressionImprovesWithDictionary()
        {
            var dict = TrainDict();

            var dataStream = DataGenerator.GetSmallStream(DataFill.Sequential);

            var normalResultStream = new MemoryStream();

            using (var compressionStream = new CompressionStream(normalResultStream))
                dataStream.CopyTo(compressionStream);

            dataStream.Seek(0, SeekOrigin.Begin);

            var dictResultStream = new MemoryStream();

            using (var compressionStream = new CompressionStream(dictResultStream))
            {
                compressionStream.LoadDictionary(dict);
                dataStream.CopyTo(compressionStream);
            }

            Assert.True(normalResultStream.Length > dictResultStream.Length);

            dictResultStream.Seek(0, SeekOrigin.Begin);

            var resultStream = new MemoryStream();

            using (var decompressionStream = new DecompressionStream(dictResultStream))
            {
                decompressionStream.LoadDictionary(dict);
                decompressionStream.CopyTo(resultStream);
            }

            Assert.True(dataStream.ToArray().SequenceEqual(resultStream.ToArray()));
        }
示例#4
0
        public void StreamingDecompressionSimpleRead(int readCount)
        {
            var data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            var tempStream = new MemoryStream();

            using (var compressionStream = new CompressionStream(tempStream))
                compressionStream.Write(data, 0, data.Length);

            tempStream.Seek(0, SeekOrigin.Begin);

            var buffer = new byte[data.Length];

            using (var decompressionStream = new DecompressionStream(tempStream))
            {
                int bytesRead;
                int totalBytesRead = 0;
                while ((bytesRead = decompressionStream.Read(buffer, totalBytesRead, Math.Min(readCount, buffer.Length - totalBytesRead))) > 0)
                {
                    Assert.LessOrEqual(bytesRead, readCount);
                    totalBytesRead += bytesRead;
                }

                Assert.AreEqual(data.Length, totalBytesRead);
            }

            Assert.AreEqual(data, buffer);
        }
        public UnbufferedLongReader(string FilePath)
        {
            int ioBufSize = Math.Min(BufSize * sizeof(long), 131072);

            file = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read, ioBufSize, FileOptions.SequentialScan);
            zip  = new DecompressionStream(file, ioBufSize);
        }
示例#6
0
        public static async Task Main()
        {
            var engine = new RazorLightEngineBuilder()
                         .UseMemoryCachingProvider()
                         .UseEmbeddedResourcesProject(typeof(Program).Assembly, rootNamespace: "RazorLight.Sandbox.Views")
                         .Build();

            //string result = await engine.CompileRenderAsync<object>("Home", null, null);
            //Console.WriteLine(result);

            await using var tempStream        = new MemoryStream();
            await using var compressionStream = new CompressionStream(tempStream);
            await GetStream(64).CopyToAsync(compressionStream);

            await using var decompressionStream = new DecompressionStream(tempStream);
            await UnwrapStream(decompressionStream);

            //System.GC.SuppressFinalize(decompressionStream);
            var model = new { UnwrappedValue = new Lazy <string>(() =>
                {
                    var x = UnwrapStream(decompressionStream).Result;
                    return(Encoding.Default.GetString(x));
                }) };

            string dynamicTemplateResult =
                await engine.CompileRenderStringAsync("templateKey", @"@using RazorLight
@Model.UnwrappedValue.Value", model, null);

            Console.WriteLine(dynamicTemplateResult);

            Console.WriteLine("Finished");
        }
示例#7
0
        static async Task <byte[]> UnwrapStream(DecompressionStream decompressionStream)
        {
            var result = new byte[64];
            await decompressionStream.ReadAsync(result, 0, 64);

            return(result);
        }
示例#8
0
        public async Task DecompressStreamAsync(int zstdBufferSize, int copyBufferSize)
        {
#if !NET48
            await
#endif
            using var decompressionStream = new DecompressionStream(new MemoryStream(CompressedStreamData), zstdBufferSize);
            await decompressionStream.CopyToAsync(Stream.Null, copyBufferSize);
        }
示例#9
0
        public async Task RoundTrip_StreamingToStreamingAsync(
            [CombinatorialValues(false, true)] bool useDict, [CombinatorialValues(false, true)] bool advanced,
            [CombinatorialValues(1, 2, 7, 101, 1024, 65535, DataGenerator.LargeBufferSize,
                                 DataGenerator.LargeBufferSize + 1)]
            int zstdBufferSize,
            [CombinatorialValues(1, 2, 7, 101, 1024, 65535, DataGenerator.LargeBufferSize,
                                 DataGenerator.LargeBufferSize + 1)]
            int copyBufferSize)
        {
            var dict       = useDict ? TrainDict() : null;
            var testStream = DataGenerator.GetLargeStream(DataFill.Sequential);

            const int offset = 1;
            var       buffer = new byte[copyBufferSize + offset + 1];

            var tempStream = new MemoryStream();

            await using (var compressionStream =
                             new CompressionStream(tempStream, Compressor.DefaultCompressionLevel, zstdBufferSize))
            {
                compressionStream.LoadDictionary(dict);
                if (advanced)
                {
                    compressionStream.SetParameter(ZSTD_cParameter.ZSTD_c_windowLog, 11);
                    compressionStream.SetParameter(ZSTD_cParameter.ZSTD_c_checksumFlag, 1);
                }

                int bytesRead;
                while ((bytesRead = await testStream.ReadAsync(buffer, offset, copyBufferSize)) > 0)
                {
                    await compressionStream.WriteAsync(buffer, offset, bytesRead);
                }
            }

            tempStream.Seek(0, SeekOrigin.Begin);

            var resultStream = new MemoryStream();

            await using (var decompressionStream = new DecompressionStream(tempStream, zstdBufferSize))
            {
                decompressionStream.LoadDictionary(dict);
                if (advanced)
                {
                    decompressionStream.SetParameter(ZSTD_dParameter.ZSTD_d_windowLogMax, 11);
                }

                int bytesRead;
                while ((bytesRead = await decompressionStream.ReadAsync(buffer, offset, copyBufferSize)) > 0)
                {
                    await resultStream.WriteAsync(buffer, offset, bytesRead);
                }
            }

            Assert.True(testStream.ToArray().SequenceEqual(resultStream.ToArray()));
        }
        public BufferedLongReader(string FilePath)
        {
            int ioBufSize = Math.Min(BufSize * sizeof(long), 131072);

            file = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read, ioBufSize, FileOptions.SequentialScan);
            zip  = new DecompressionStream(file, ioBufSize);

            //最初はここで強制的に読ませる
            FillNextBuf();
            ActualReadAuto();
        }
示例#11
0
        public void RoundTrip_BatchToStreaming()
        {
            var data = DataGenerator.GetLargeBuffer(DataFill.Sequential);

            byte[] compressed;
            using (var compressor = new Compressor())
                compressed = compressor.Wrap(data);

            var resultStream = new MemoryStream();

            using (var decompressionStream = new DecompressionStream(new MemoryStream(compressed)))
                decompressionStream.CopyTo(resultStream);

            Assert.AreEqual(data, resultStream.ToArray());
        }
示例#12
0
        public async Task RoundTrip_StreamingToStreamingAsync(
            [Values(false, true)] bool useDict, [Values(false, true)] bool advanced,
            [Values(1, 2, 7, 101, 1024, 65535, DataGenerator.LargeBufferSize, DataGenerator.LargeBufferSize + 1)] int zstdBufferSize,
            [Values(1, 2, 7, 101, 1024, 65535, DataGenerator.LargeBufferSize, DataGenerator.LargeBufferSize + 1)] int copyBufferSize)
        {
            var dict       = useDict ? TrainDict() : null;
            var testStream = DataGenerator.GetLargeStream(DataFill.Sequential);

            const int offset = 1;
            var       buffer = new byte[copyBufferSize + offset + 1];

            var tempStream = new MemoryStream();

            using (var compressionOptions = new CompressionOptions(dict, advanced ? new Dictionary <ZSTD_cParameter, int> {
                { ZSTD_cParameter.ZSTD_c_windowLog, 11 }, { ZSTD_cParameter.ZSTD_c_checksumFlag, 1 }, { ZSTD_cParameter.ZSTD_c_nbWorkers, 4 }
            } : null))
                await using (var compressionStream = new CompressionStream(tempStream, compressionOptions, zstdBufferSize))
                {
                    int bytesRead;
                    while ((bytesRead = await testStream.ReadAsync(buffer, offset, copyBufferSize)) > 0)
                    {
                        await compressionStream.WriteAsync(buffer, offset, bytesRead);
                    }
                }

            tempStream.Seek(0, SeekOrigin.Begin);

            var resultStream = new MemoryStream();

            using (var decompressionOptions = new DecompressionOptions(dict, advanced ? new Dictionary <ZSTD_dParameter, int> {
                { ZSTD_dParameter.ZSTD_d_windowLogMax, 11 }
            } : null))
                await using (var decompressionStream = new DecompressionStream(tempStream, decompressionOptions, zstdBufferSize))
                {
                    int bytesRead;
                    while ((bytesRead = await decompressionStream.ReadAsync(buffer, offset, copyBufferSize)) > 0)
                    {
                        await resultStream.WriteAsync(buffer, offset, bytesRead);
                    }
                }

            Assert.AreEqual(testStream.ToArray(), resultStream.ToArray());
        }
示例#13
0
        public void StreamingCompressionSimpleWrite(byte[] data, int offset, int count)
        {
            var tempStream = new MemoryStream();

            using (var compressionStream = new CompressionStream(tempStream))
                compressionStream.Write(data, offset, count);

            tempStream.Seek(0, SeekOrigin.Begin);

            var resultStream = new MemoryStream();

            using (var decompressionStream = new DecompressionStream(tempStream))
                decompressionStream.CopyTo(resultStream);

            var dataToCompress = new byte[count];

            Array.Copy(data, offset, dataToCompress, 0, count);

            Assert.AreEqual(dataToCompress, resultStream.ToArray());
        }
示例#14
0
        public void StreamingCompressionFlushDataFromInternalBuffers()
        {
            var testBuffer = new byte[1];

            var tempStream = new MemoryStream();

            using var compressionStream = new CompressionStream(tempStream);
            compressionStream.Write(testBuffer, 0, testBuffer.Length);
            compressionStream.Flush();

            Assert.True(tempStream.Length > 0);
            tempStream.Seek(0, SeekOrigin.Begin);

            //NOTE: without ZSTD_endStream call on compression
            var resultStream = new MemoryStream();

            using (var decompressionStream = new DecompressionStream(tempStream))
                decompressionStream.CopyTo(resultStream);

            Assert.True(testBuffer.SequenceEqual(resultStream.ToArray()));
        }
示例#15
0
        public void StreamingCompressionZeroAndOneByte()
        {
            var data = new byte[] { 0, 0, 0, 1, 2, 3, 4, 0, 0, 0 };

            var tempStream = new MemoryStream();

            using (var compressionStream = new CompressionStream(tempStream))
            {
                compressionStream.Write(data, 0, 0);
                compressionStream.Write(ReadOnlySpan <byte> .Empty);
                compressionStream.WriteAsync(data, 0, 0).GetAwaiter().GetResult();
                compressionStream.WriteAsync(ReadOnlyMemory <byte> .Empty).GetAwaiter().GetResult();

                compressionStream.Write(data, 3, 1);
                compressionStream.Write(new ReadOnlySpan <byte>(data, 4, 1));
                compressionStream.Flush();
                compressionStream.WriteAsync(data, 5, 1).GetAwaiter().GetResult();
                compressionStream.WriteAsync(new ReadOnlyMemory <byte>(data, 6, 1)).GetAwaiter().GetResult();
                compressionStream.FlushAsync().GetAwaiter().GetResult();
            }

            tempStream.Seek(0, SeekOrigin.Begin);

            var result = new byte[data.Length];

            using (var decompressionStream = new DecompressionStream(tempStream))
            {
                Assert.AreEqual(0, decompressionStream.Read(result, 0, 0));
                Assert.AreEqual(0, decompressionStream.Read(Span <byte> .Empty));
                Assert.AreEqual(0, decompressionStream.ReadAsync(result, 0, 0).GetAwaiter().GetResult());
                Assert.AreEqual(0, decompressionStream.ReadAsync(Memory <byte> .Empty).GetAwaiter().GetResult());

                Assert.AreEqual(1, decompressionStream.Read(result, 3, 1));
                Assert.AreEqual(1, decompressionStream.Read(new Span <byte>(result, 4, 1)));
                Assert.AreEqual(1, decompressionStream.ReadAsync(result, 5, 1).GetAwaiter().GetResult());
                Assert.AreEqual(1, decompressionStream.ReadAsync(new Memory <byte>(result, 6, 1)).GetAwaiter().GetResult());
            }

            Assert.AreEqual(data, result);
        }
示例#16
0
 public void DecompressStream(int zstdBufferSize, int copyBufferSize)
 {
     using var decompressionStream = new DecompressionStream(new MemoryStream(CompressedStreamData), zstdBufferSize);
     decompressionStream.CopyTo(Stream.Null, copyBufferSize);
 }