예제 #1
0
        /// <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>
        private static IEnumerable <Tuple <MarshalMemoryBlock, DateTime, DateTime, int> > ReadTagDataBlock2(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 = ReadTagIndexInDataPointer(datafile,tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);

            ReadRegionHead(datafile, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);

            var tagIndex = tid % tagCount;

            int blockcount = fileDuration * 60 / blockDuration;

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

            DateTime sstart = start;
            DateTime send   = end;

            int buffersize = 1024 * 1024 * 2;
            //分配读缓存
            IntPtr mdataBuffer    = Marshal.AllocHGlobal(buffersize);
            long   mbufferadderss = 0;
            int    bufferLen      = 0;

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

            var headdata = datafile.Read(offset + blockpointer + tagIndex * blockcount * 8, blockcount * 8);

            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(blockindex * 8); //读取DataBlock的相对地址

                if (dataPointer > 0)
                {
                    MarshalMemoryBlock vmm = null;
                    //说明数据没有采用Zip压缩,可以直接读取使用
                    var dp       = dataPointer;
                    int datasize = 0;
                    int dataloc  = 0;
                    if (dp >= mbufferadderss && (dp - mbufferadderss + 4) <= bufferLen && (dp - mbufferadderss + 4 + MemoryHelper.ReadInt32(mdataBuffer, dp - mbufferadderss)) <= bufferLen)
                    {
                        datasize = MemoryHelper.ReadInt32(mdataBuffer, dp - mbufferadderss);
                        dataloc  = (int)(dp - mbufferadderss + 4);
                    }
                    else
                    {
                        bufferLen      = datafile.Read(mdataBuffer, dp, buffersize);
                        mbufferadderss = dp;
                        datasize       = MemoryHelper.ReadInt32(mdataBuffer, 0);
                        dataloc        = (int)(dp - mbufferadderss + 4);
                    }

                    if (datasize > 0 && datasize < datafile.Length)
                    {
                        vmm = new MarshalMemoryBlock(datasize, datasize);
                        MemoryHelper.MemoryCopy(mdataBuffer, dataloc, vmm.Buffers[0], 0, datasize);
                    }

                    if (vmm != null)
                    {
                        yield return(new Tuple <MarshalMemoryBlock, DateTime, DateTime, int>(vmm, sstart, send, timetick));
                    }
                }
                sstart = send;
            }

            headdata.Dispose();
            Marshal.FreeHGlobal(mdataBuffer);
        }
예제 #2
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>
        private static Dictionary <MarshalMemoryBlock, Tuple <List <DateTime>, int> > ReadTagDataBlock2(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 = ReadTagIndexInDataPointer(datafile,tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);

            ReadRegionHead(datafile, offset, out tagCount, out fileDuration, out blockDuration, out timetick, out blockpointer, out time);

            var tagIndex = tid % tagCount;

            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);

            int buffersize = 1024 * 1024 * 2;
            //分配读缓存
            IntPtr mdataBuffer    = Marshal.AllocHGlobal(buffersize);
            long   mbufferadderss = 0;
            int    bufferLen      = buffersize;


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

            var headdata = datafile.Read(offset + blockpointer + tagIndex * blockcount * 8, blockcount * 8);

            long mLastBuffer       = 0;
            int  mLastDataLoc      = 0;
            int  mLastDataSize     = 0;
            MarshalMemoryBlock vmm = null;

            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 = headdata.ReadInt(tagIndex * blockcount * 12 + blockindex * 12); //读取DataBlock的相对地址
                //var dataPointerbase = headdata.ReadLong(tagIndex * blockcount * 12 + blockindex * 12 + 4); //读取DataBlock的基地址

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

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


                    //说明数据没有采用Zip压缩,可以直接读取使用
                    var dp       = dataPointer;
                    int datasize = 0;
                    int dataloc  = 0;
                    if (dp >= mbufferadderss && (dp - mbufferadderss + 4) <= bufferLen && (dp - mbufferadderss + 4 + MemoryHelper.ReadInt32(mdataBuffer, dp - mbufferadderss)) <= bufferLen)
                    {
                        datasize = MemoryHelper.ReadInt32(mdataBuffer, dp - mbufferadderss);
                        dataloc  = (int)(dp - mbufferadderss + 4);
                    }
                    else
                    {
                        bufferLen      = datafile.Read(mdataBuffer, dp, buffersize);
                        mbufferadderss = dp;
                        datasize       = MemoryHelper.ReadInt32(mdataBuffer, 0);
                        dataloc        = (int)(dp - mbufferadderss + 4);
                    }

                    if (datasize > 0 && (mLastBuffer != mbufferadderss || mLastDataLoc != dataloc || mLastDataSize != datasize))
                    {
                        vmm = new MarshalMemoryBlock(datasize, datasize);
                        MemoryHelper.MemoryCopy(mdataBuffer, dataloc, vmm.Buffers[0], 0, datasize);

                        mLastBuffer   = mbufferadderss;
                        mLastDataLoc  = dataloc;
                        mLastDataSize = datasize;
                    }
                    else if (datasize <= 0)
                    {
                        vmm = null;
                    }

                    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);
                            }
                        }
                    }
                }
            }

            headdata.Dispose();
            Marshal.FreeHGlobal(mdataBuffer);
            return(re);
        }