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