public async Task <int> ReadAsync_Parallel(int totWorkerThreads, BufferedStreamReaderConfig config_r, bool usingMemoryStream)
 {
     if (!usingMemoryStream)
     {
         FileHelper.FlushFileCache(tmpFilename_parallel);
     }
     try
     {
         int res = 0;
         using (StreamChain sc1 = new StreamChain())
         {
             Stream s = sc1.ComposeChain(
                 usingMemoryStream ? ms_parallel :
                 File.Open(tmpFilename_parallel, FileMode.Open, FileAccess.Read, FileShare.None), config_r);
             using (var dmp = new CollectionDeserializerAsync <T>(new FIFOWorkerConfig(totWorkerThreads), opts_standard))
                 await foreach (var i in dmp.DeserializeAsync(s))
                 {
                     res ^= i.Item.DoStuff();
                 }
         }
         return(res);
     }
     finally
     {
         if (usingMemoryStream)
         {
             ms_parallel.Flush();
             ms_parallel.Position = 0;
         }
     }
 }
        public void RequestNewBuffer_NeverRunsPastShadowBufferSize(int totalPreFetchBlocks, int shadowBufferSize)
        {
            int stopReadAt  = 5;
            int curPos      = 0;
            int forceStopAt = 100;
            var streamMock  = new Mock <Stream>(MockBehavior.Loose);

            streamMock.Setup(p => p.Read(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>()))
            .Returns <byte[], int, int>((a, b, c) => { curPos += c; return(c); });
            BufferedStreamReaderConfig config = GetConfig(shadowBufferSize, totalPreFetchBlocks, stopReadAt);
            List <byte>       resArray        = new List <byte>();
            SynchronousReader pfh             = new SynchronousReader(streamMock.Object, config);

            int totRead = 0;
            int counter = 0;

            do
            {
                ShadowBufferData destBuffer = pfh.RequestNewBuffer();
                pfh.ReturnBuffer(destBuffer);
                totRead  = destBuffer?.byteCount ?? 0;
                counter += totRead;
            }while (totRead != 0 && counter < forceStopAt);

            Assert.AreEqual(stopReadAt, counter);
            Assert.AreEqual(stopReadAt, curPos);
        }
        public async Task <int> ReadAsync_Baseline(BufferedStreamReaderConfig config_r, bool usingMemoryStream)
        {
            if (!usingMemoryStream)
            {
                FileHelper.FlushFileCache(tmpFilename_baseline);
            }
            try
            {
                int res = 0;
                using (StreamChain sc1 = new StreamChain())
                {
                    Stream s = sc1.ComposeChain(usingMemoryStream ? ms_baseline :
                                                File.Open(tmpFilename_baseline, FileMode.Open, FileAccess.Read, FileShare.None), config_r);
                    using (var streamReader = new MessagePackStreamReader(s, true))
                        while (await streamReader.ReadAsync(CancellationToken.None) is ReadOnlySequence <byte> msgpack)
                        {
                            var obj = MessagePackSerializer.Deserialize <Frame <T> >(msgpack, opts_standard, CancellationToken.None).Item;

                            res ^= obj.DoStuff();
                        }
                }
                return(res);
            }
            finally
            {
                if (usingMemoryStream)
                {
                    ms_baseline.Flush();
                    ms_baseline.Position = 0;
                }
            }
        }
示例#4
0
        public async Task <int> ReadAsync_Parallel(int totWorkerThreads, BufferedStreamReaderConfig config_r, bool usingMemoryStream)
        {
            if (!usingMemoryStream)
            {
                FileHelper.FlushFileCache(tmpFilename_parallel);
            }
            var opts = new FrameParallelOptions(
                totWorkerThreads, opts_standard.WithResolver(FrameResolverPlusStandarResolver.Instance));

            try
            {
                using (StreamChain sc1 = new StreamChain())
                {
                    Stream s = sc1.ComposeChain(
                        usingMemoryStream ? ms_parallel :
                        File.Open(tmpFilename_parallel, FileMode.Open, FileAccess.Read, FileShare.None), config_r);
                    var obj = await MessagePackSerializer.DeserializeAsync <T_Parallel>(s, opts);

                    return(obj.DoStuff());
                }
            }
            finally
            {
                if (usingMemoryStream)
                {
                    ms_parallel.Flush();
                    ms_parallel.Position = 0;
                }
            }
        }
示例#5
0
        public async Task <int> ReadAsync_Baseline(BufferedStreamReaderConfig config_r, bool usingMemoryStream)
        {
            if (!usingMemoryStream)
            {
                FileHelper.FlushFileCache(tmpFilename_baseline);
            }
            try
            {
                using (StreamChain sc1 = new StreamChain())
                {
                    Stream s = sc1.ComposeChain(
                        usingMemoryStream ? ms_baseline :
                        File.Open(tmpFilename_baseline, FileMode.Open, FileAccess.Read, FileShare.None), config_r);
                    var obj = await MessagePackSerializer.DeserializeAsync <T_Baseline>(s, opts_standard);

                    return(obj.DoStuff());
                }
            }
            finally
            {
                if (usingMemoryStream)
                {
                    ms_baseline.Flush();
                    ms_baseline.Position = 0;
                }
            }
        }
示例#6
0
 public Stream ComposeChain(Stream s, BufferedStreamReaderConfig sr_cfg)
 {
     if (!(s is MemoryStream))
     {
         itemsToDispose.Add(s);
     }
     if (sr_cfg != null)
     {
         itemsToDispose.Add(s = new BufferedStreamReader(s, sr_cfg));
     }
     return(s);
 }
        public async Task <int> ReadAsync_Baseline(bool isSmall, int totalPreFetchBlocks, bool usingMemoryStream)
        {
            BufferedStreamReaderConfig config = totalPreFetchBlocks >= 0 ? new BufferedStreamReaderConfig(totalPreFetchBlocks: totalPreFetchBlocks) : null;

            if (isSmall)
            {
                return(await logic_small.ReadAsync_Baseline(config, usingMemoryStream));
            }
            else
            {
                return(await logic_large.ReadAsync_Baseline(config, usingMemoryStream));
            }
        }
        public int Read_Baseline(BufferedStreamReaderConfig config_r, bool usingMemoryStream)
        {
            if (!usingMemoryStream)
            {
                FileHelper.FlushFileCache(tmpFilename_baseline);
            }
            try
            {
                Type t   = typeof(T);
                int  res = 0;
                using (StreamChain sc1 = new StreamChain())
                {
                    Stream s = sc1.ComposeChain(usingMemoryStream ? ms_baseline :
                                                File.Open(tmpFilename_baseline, FileMode.Open, FileAccess.Read, FileShare.None), config_r);
                    do
                    {
                        object obj = model.DeserializeWithLengthPrefix(s, null, t, PrefixStyle.Base128, 1);

                        if (obj is T objT)
                        {
                            res ^= objT.DoStuff();
                        }
                        else if (obj is null)
                        {
                            break;
                        }
                        else
                        {
                            throw new Exception("unexpected obj type deserialized");
                        }
                    } while (true);
                }
                return(res);
            }
            finally
            {
                if (usingMemoryStream)
                {
                    ms_baseline.Flush();
                    ms_baseline.Position = 0;
                }
            }
        }
        public void RequestNewBuffer_Returns0BytesAtEOF(int totalPreFetchBlocks, int shadowBufferSize, int totBytes)
        {
            byte[] originalBuffer             = Enumerable.Range(1, totBytes).Select(f => (byte)f).ToArray();
            BufferedStreamReaderConfig config = GetConfig(shadowBufferSize, totalPreFetchBlocks);
            SynchronousReader          pfh    = new SynchronousReader(new MemoryStream(originalBuffer), config);

            while (true)
            {
                ShadowBufferData destBuffer = pfh.RequestNewBuffer();
                if (destBuffer == null || destBuffer.byteCount == 0)
                {
                    break;
                }
                pfh.ReturnBuffer(destBuffer);
            }
            ShadowBufferData lastDestBuffer = pfh.RequestNewBuffer();
            int lastRead = lastDestBuffer?.byteCount ?? 0;

            Assert.AreEqual(0, lastRead);
        }
        public void RequestNewBuffer_CorrectBytesAreReturned(int totalPreFetchBlocks, int shadowBufferSize, int totBytes)
        {
            byte[]      originalBuffer        = Enumerable.Range(1, totBytes).Select(f => (byte)f).ToArray();
            List <byte> resArray              = new List <byte>();
            BufferedStreamReaderConfig config = GetConfig(shadowBufferSize, totalPreFetchBlocks);
            SynchronousReader          pfh    = new SynchronousReader(new MemoryStream(originalBuffer), config);

            while (true)
            {
                ShadowBufferData destBuffer = pfh.RequestNewBuffer();
                if (destBuffer == null || destBuffer.byteCount == 0)
                {
                    break;
                }
                resArray.AddRange(destBuffer.buffer.Take(destBuffer.byteCount));
                pfh.ReturnBuffer(destBuffer);
            }

            Assert.AreEqual(originalBuffer, resArray.ToArray());
            Assert.DoesNotThrow(pfh.Abort);
        }