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