コード例 #1
0
        private async Task writeDataAsync(List <T> samples, string dim, long index)
        {
            //    Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "   序列化payload");
            //var ms = new MemoryStream();
            //Serializer.Serialize(ms, samples);
            //byte[] result = ms.ToArray();
            byte[] result = ZeroFormatterSerializer.Serialize(samples);
            //    Debug.WriteLine("size: "+result.Count());
            //    Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "   结束序列化payload");
            SEPayload newPayload = new SEPayload();

            newPayload.parentid   = signalId;
            newPayload.indexes    = index;
            newPayload.samples    = result;
            newPayload.dimensions = dim;
            //    Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "   插入payload");
            await mapper.InsertAsync <SEPayload>(newPayload);

            //    Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "   结束插入payload");
        }
コード例 #2
0
        public async Task AppendSampleAsync(List <long> dim, List <T> samples)
        {
            //   mySignal.IsWritting = true;
            long   index;
            string dimension = DimensionsToText(dim);

            if (mySignal.IsWritting == true)
            {
                cacheBuffer[dimension].templeSample.AddRange(samples);
            }
            mySignal.IsWritting = true;
            if (lastDimension.Equals(dimension))
            {
                List <T> templeSamples = cacheBuffer[dimension].templeSample;
                long     templeIndex   = cacheBuffer[dimension].templeIndex;

                if (samples.Count + templeSamples.Count >= sampleCount)
                {
                    //补充完再添加
                    List <T> data = new List <T>();
                    templeSamples.AddRange(samples);
                    //把缓存Buffer里的数据写入数据库
                    while (templeSamples.Count >= sampleCount)
                    {
                        index = templeIndex + 1;
                        //保证每个Payload大小为sampleCount
                        for (int i = 0; i < sampleCount; i++)
                        {
                            data.Add(templeSamples[i]);
                        }
                        templeSamples.RemoveRange(0, (int)sampleCount);
                        await writeDataAsync(data, dimension, index);

                        templeIndex = index;
                    }
                    cacheBuffer[dimension].templeIndex = templeIndex;
                }
                else
                {
                    //把数据保存在缓存里
                    cacheBuffer[dimension].templeSample.AddRange(samples);
                }
            }
            else
            {
                List <T> templeSamples = new List <T>();
                long     templeIndex   = -1;
                if (cacheBuffer.ContainsKey(dimension))
                {
                    templeSamples.AddRange(cacheBuffer[dimension].templeSample);
                    templeIndex = cacheBuffer[dimension].templeIndex;
                }
                else
                {
                    SEPayload        lastPayload  = (await mapper.FetchAsync <SEPayload>("SELECT * FROM sepayload where parentid=? and dimensions=?", signalId, dimension)).LastOrDefault();
                    PayloadCache <T> payloadCache = new PayloadCache <T>();
                    if (lastPayload != null)
                    {
                        templeSamples = ZeroFormatterSerializer.Deserialize <List <T> >(lastPayload.samples);
                        //var om = new MemoryStream(lastPayload.samples);
                        //templeSamples = Serializer.Deserialize<List<T>>(om);
                        templeIndex = lastPayload.indexes - 1;

                        payloadCache.templeIndex  = templeIndex;
                        payloadCache.templeSample = templeSamples;
                    }
                    cacheBuffer.Add(dimension, payloadCache);
                }
                if (samples.Count + templeSamples.Count >= sampleCount)
                {
                    List <T> data = new List <T>();
                    templeSamples.AddRange(samples);
                    while (templeSamples.Count >= sampleCount)
                    {
                        index = templeIndex + 1;
                        for (int i = 0; i < sampleCount; i++)
                        {
                            data.Add(templeSamples[i]);
                        }
                        templeSamples.RemoveRange(0, (int)sampleCount);
                        await writeDataAsync(data, dimension, index);

                        templeIndex = index;
                    }
                    cacheBuffer[dimension].templeSample.Clear();
                    cacheBuffer[dimension].templeSample.AddRange(templeSamples);
                    cacheBuffer[dimension].templeIndex = templeIndex;
                    lastDimension = dimension;
                }
                else
                {
                    cacheBuffer[dimension].templeSample.AddRange(samples);
                    lastDimension = dimension;
                }
            }
            mySignal.IsWritting = false;
        }