Beispiel #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="datafile"></param>
        /// <param name="tid"></param>
        /// <param name="offset"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public static MarshalMemoryBlock ReadTagDataBlock(this DataFileSeriserbase datafile, int tid, long offset, int index, out int timetick)
        {
            int      fileDuration, blockDuration = 0;
            int      tagCount = 0;
            DateTime time;
            long     blockpointer = 0;

            var dindex     = datafile.ReadTagIndexInDataPointer(tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);
            int blockIndex = index;

            int blockcount = fileDuration * 60 / blockDuration;
            var headdata   = GetHeadBlock(datafile, offset + blockpointer, tagCount * blockcount * 12);

            //var dataPointer = datafile.ReadLong(blockIndex * 8 + dindex * tagCount * 8); //读取DataBlock的地址

            //var dataPointer = datafile.ReadInt(offset + blockpointer + dindex * 12 + blockIndex * tagCount * 12); //读取DataBlock的相对地址
            //var dataPointerbase = datafile.ReadLong(offset + blockpointer + dindex * 12 + blockIndex * tagCount * 12 + 4); //读取DataBlock的基地址

            var dataPointer     = headdata.ReadInt(dindex * 12 + blockIndex * tagCount * 12);      //读取DataBlock的相对地址
            var dataPointerbase = headdata.ReadLong(dindex * 12 + blockIndex * tagCount * 12 + 4); //读取DataBlock的基地址


            if (dataPointerbase > 0)
            {
                var vmm = GetDataMemory(datafile, dataPointerbase, dataPointer);
                return(vmm);
            }
            else
            {
                return(null);
            }
        }
Beispiel #2
0
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="datafile"></param>
        ///// <param name="address"></param>
        //private static unsafe MarshalMemoryBlock DecompressMemory(DataFileSeriserbase datafile,long address)
        //{
        //    Stopwatch sw = new Stopwatch();
        //    sw.Start();
        //    var vsize = datafile.ReadInt(address);
        //    var dsize = datafile.ReadInt(address + 4);
        //    var datas = datafile.Read(address + 8, vsize);
        //    int dtmp = 0;
        //    MarshalMemoryBlock mmb = new MarshalMemoryBlock(dsize, dsize);

        //    long ltmp = sw.ElapsedMilliseconds;

        //    System.IO.Compression.BrotliDecoder.TryDecompress(new ReadOnlySpan<byte>((void*)datas.Handles[0], vsize), new Span<byte>((void*)mmb.Handles[0], dsize), out dtmp);

        //    if(dtmp!=dsize)
        //    {
        //        LoggerService.Service.Warn("DataFileInfo", "解压缩数据长度不一致!"+datafile.FileName);
        //    }

        //    long ltmp2 = sw.ElapsedMilliseconds;

        //    datas.Dispose();
        //    sw.Stop();

        //    Debug.Print("查询耗时 构建对象耗时:" + ltmp + ",解压耗时:" + (ltmp2 - ltmp)+", Dispose 耗时:"+(sw.ElapsedMilliseconds-ltmp2));

        //    return mmb;
        //}

        /// <summary>
        ///
        /// </summary>
        /// <param name="datafile"></param>
        /// <param name="startTime"></param>
        /// <param name="tid"></param>
        /// <param name="offset"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="timetick"></param>
        /// <returns></returns>
        public static IEnumerable <Tuple <MarshalMemoryBlock, DateTime, DateTime, int> > ReadTagDataBlock2(this DataFileSeriserbase datafile, int tid, long offset, DateTime start, DateTime end)
        {
            int      fileDuration, blockDuration = 0;
            int      tagCount     = 0;
            long     blockpointer = 0;
            int      timetick     = 0;
            DateTime time;

            var tagIndex   = datafile.ReadTagIndexInDataPointer(tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);
            int blockcount = fileDuration * 60 / blockDuration;

            //读取文件开始时间
            var startTime = datafile.ReadDateTime(0);

            DateTime sstart = start;
            DateTime send   = end;

            var headdata = GetHeadBlock(datafile, offset + blockpointer, tagCount * blockcount * 12);

            while (sstart < end)
            {
                var ttmp = Math.Round((sstart - startTime).TotalSeconds, 3);
                var vv   = blockDuration * 60 - (ttmp % (blockDuration * 60));
                send = sstart.AddSeconds(vv);

                if (send > end)
                {
                    send = end;
                }
                int blockindex = (int)(ttmp / (blockDuration * 60));

                if (blockindex >= blockcount)
                {
                    break;
                    //throw new Exception("DataPointer index is out of total block number");
                }

                var dataPointer = headdata.ReadInt(tagIndex * 12 + blockindex * tagCount * 12);          //读取DataBlock的相对地址

                var dataPointerbase = headdata.ReadLong(tagIndex * 12 + blockindex * tagCount * 12 + 4); //读取DataBlock的基地址

                if (dataPointerbase > 0)
                {
                    var vmm = GetDataMemory(datafile, dataPointerbase, dataPointer);
                    if (vmm != null)
                    {
                        yield return(new Tuple <MarshalMemoryBlock, DateTime, DateTime, int>(vmm, sstart, send, timetick));
                    }
                }
                sstart = send;
            }
        }
Beispiel #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="datafile"></param>
        /// <param name="tid"></param>
        /// <param name="offset"></param>
        /// <param name="dataTime"></param>
        /// <param name="timetick"></param>
        /// <returns></returns>
        public static MarshalMemoryBlock ReadTagDataBlock(this DataFileSeriserbase datafile, int tid, long offset, DateTime dataTime, out int timetick, out int index)
        {
            int      fileDuration, blockDuration = 0;
            int      tagCount = 0;
            DateTime time;
            long     blockpointer = 0;

            var dindex     = datafile.ReadTagIndexInDataPointer(tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);
            int blockcount = fileDuration * 60 / blockDuration;

            var startTime  = datafile.ReadDateTime(16);
            var ttmp       = (dataTime - startTime).TotalMinutes;
            int blockIndex = (int)(ttmp / blockDuration);

            if (ttmp % blockDuration > 0)
            {
                blockIndex++;
            }

            if (blockIndex > blockcount)
            {
                throw new Exception("DataPointer index is out of total block number");
            }
            index = blockIndex;

            var headdata = GetHeadBlock(datafile, offset + blockpointer, tagCount * blockcount * 12);

            ////var dataPointer = datafile.ReadLong(blockIndex * 8 + dindex * tagCount * 8); //读取DataBlock的地址
            //var dataPointer = datafile.ReadInt(offset + blockpointer + dindex * 12 + blockIndex * tagCount * 12); //读取DataBlock的相对地址
            //var dataPointerbase = datafile.ReadLong(offset + blockpointer + dindex * 12 + blockIndex * tagCount * 12 + 4); //读取DataBlock的基地址

            var dataPointer     = headdata.ReadInt(dindex * 12 + blockIndex * tagCount * 12);      //读取DataBlock的相对地址
            var dataPointerbase = headdata.ReadLong(dindex * 12 + blockIndex * tagCount * 12 + 4); //读取DataBlock的基地址


            var vmm = GetDataMemory(datafile, dataPointerbase, dataPointer);

            return(vmm);
        }
Beispiel #4
0
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="datafile"></param>
        ///// <param name="tid"></param>
        ///// <param name="offset"></param>
        ///// <param name="dataTimes"></param>
        ///// <param name="timetick"></param>
        ///// <returns></returns>
        //public static Dictionary<DateTime, MarshalMemoryBlock> ReadTagDataBlock(this DataFileSeriserbase datafile, int tid, long offset, List<DateTime> dataTimes, out int timetick)
        //{
        //    int fileDuration, blockDuration = 0;
        //    int tagCount = 0;
        //    long blockpointer = 0;
        //    DateTime time;
        //    var blockIndex = datafile.ReadTagIndexInDataPointer(tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);
        //    int blockcount = fileDuration * 60 / blockDuration;

        //    var startTime = datafile.ReadDateTime(16);

        //    Dictionary<long, MarshalMemoryBlock> rtmp = new Dictionary<long, MarshalMemoryBlock>();

        //    Dictionary<DateTime, MarshalMemoryBlock> re = new Dictionary<DateTime, MarshalMemoryBlock>();

        //    foreach (var vdd in dataTimes)
        //    {
        //        var ttmp = (vdd - startTime).TotalMinutes;
        //        int dindex = (int)(ttmp / blockDuration);
        //        if (ttmp % blockDuration > 0)
        //        {
        //            dindex++;
        //        }

        //        if (dindex > blockcount)
        //        {
        //            throw new Exception("DataPointer index is out of total block number");
        //        }

        //        var dataPointer = datafile.ReadInt(offset + blockpointer + dindex * 12 + blockIndex * tagCount * 12); //读取DataBlock的相对地址
        //        var dataPointerbase = datafile.ReadLong(offset + blockpointer + dindex * 12 + blockIndex * tagCount * 12 + 4); //读取DataBlock的基地址


        //        //var dataPointer = datafile.ReadLong(blockIndex * 8 + dindex * tagCount * 8); //读取DataBlock的地址

        //        //var datasize = datafile.ReadInt(dataPointer); //读取DataBlock 的大小

        //        var vmm = GetDataMomeoy(datafile, dataPointerbase);
        //        var datasize = vmm.ReadInt(dataPointer);


        //        if (!rtmp.ContainsKey(dataPointer))
        //        {
        //            var rmm = datafile.Read(dataPointer + 4, datasize);
        //            re.Add(vdd, rmm);
        //            rtmp.Add(dataPointer, rmm);
        //        }
        //        else
        //        {
        //            re.Add(vdd, rtmp[dataPointer]);
        //        }
        //    }
        //    return re;
        //}

        /// <summary>
        ///
        /// </summary>
        /// <param name="datafile"></param>
        /// <param name="tid"></param>
        /// <param name="offset"></param>
        /// <param name="dataTimes"></param>
        /// <param name="timetick"></param>
        /// <returns></returns>
        public static Dictionary <MarshalMemoryBlock, Tuple <List <DateTime>, int> > ReadTagDataBlock2(this DataFileSeriserbase datafile, int tid, long offset, List <DateTime> dataTimes, out int timetick)
        {
            int      fileDuration, blockDuration = 0;
            int      tagCount     = 0;
            long     blockpointer = 0;
            DateTime time;
            var      tagIndex = datafile.ReadTagIndexInDataPointer(tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);

            Dictionary <long, MarshalMemoryBlock> rtmp = new Dictionary <long, MarshalMemoryBlock>();

            Dictionary <MarshalMemoryBlock, Tuple <List <DateTime>, int> > re = new Dictionary <MarshalMemoryBlock, Tuple <List <DateTime>, int> >();

            if (tagCount == 0)
            {
                return(re);
            }

            int blockcount = fileDuration * 60 / blockDuration;

            var startTime = datafile.ReadDateTime(0);

            var headdata = GetHeadBlock(datafile, offset + blockpointer, tagCount * blockcount * 12);

            foreach (var vdd in dataTimes)
            {
                var ttmp       = (vdd - startTime).TotalMinutes;
                int blockindex = (int)(ttmp / blockDuration);

                if (blockindex > blockcount)
                {
                    throw new Exception("DataPointer index is out of total block number");
                }

                //var dataPointer = datafile.ReadInt(offset + blockpointer + tagIndex * 12 + blockindex * tagCount * 12); //读取DataBlock的相对地址
                //var dataPointerbase = datafile.ReadLong(offset + blockpointer + tagIndex * 12 + blockindex * tagCount * 12 + 4); //读取DataBlock的基地址

                var dataPointer     = headdata.ReadInt(tagIndex * 12 + blockindex * tagCount * 12);      //读取DataBlock的相对地址
                var dataPointerbase = headdata.ReadLong(tagIndex * 12 + blockindex * tagCount * 12 + 4); //读取DataBlock的基地址

                if (dataPointerbase > 0)
                {
                    //var datasize = datafile.ReadInt(dataPointer); //读取DataBlock 的大小
                    var vmm = GetDataMemory(datafile, dataPointerbase, dataPointer);

                    if (vmm != null)
                    {
                        if (!rtmp.ContainsKey(dataPointer))
                        {
                            //var rmm = datafile.Read(dataPointer + 4, datasize);
                            if (!re.ContainsKey(vmm))
                            {
                                re.Add(vmm, new Tuple <List <DateTime>, int>(new List <DateTime>()
                                {
                                    vdd
                                }, blockindex));
                            }
                            else
                            {
                                re[vmm].Item1.Add(vdd);
                            }
                            rtmp.Add(dataPointer, vmm);
                        }
                        else
                        {
                            //var rmm = rtmp[dataPointer];
                            if (!re.ContainsKey(vmm))
                            {
                                re.Add(vmm, new Tuple <List <DateTime>, int>(new List <DateTime>()
                                {
                                    vdd
                                }, blockindex));
                            }
                            else
                            {
                                re[vmm].Item1.Add(vdd);
                            }
                        }
                    }
                }
            }
            return(re);
        }