提交 b2b0ff90 编写于 作者: cdy816's avatar cdy816

单个文件保存指定数量的变量的历史记录

上级 628dfe72
......@@ -65,6 +65,11 @@ namespace Cdy.Tag
#region ... Properties ...
/// <summary>
/// 单个文件内变量的个数
/// </summary>
public int TagCountOneFile { get; set; } = 100000;
#endregion ...Properties...
#region ... Methods ...
......@@ -74,8 +79,10 @@ namespace Cdy.Tag
/// </summary>
public void CalMemory(long size)
{
/* 内存结构:head+数据区指针+数据区
head:数据大小(4)+变量数量(4)+起始时间(8)
/* 内存结构:Head+[DataRegion]
* Head:数据区域个数(4)+时间(8)+[区域ID(4)+区域地址(8)]
* DataRegion:region head+数据区指针+数据区
region head:数据大小(4)+变量数量(4)
数据区指针:[ID(4) + address(4)]
数据区:[data block]
data block:size+compressType+data
......@@ -177,6 +184,16 @@ namespace Cdy.Tag
/// </summary>
private void Compress()
{
/* 内存结构:Head+[DataRegion]
* Head:数据区域个数(4)+时间(8)+[区域ID(4)+区域地址(8)]
* DataRegion:region head+数据区指针+数据区
region head:数据大小(4)+变量数量(4)
数据区指针:[ID(4) + address(4)]
数据区:[data block]
data block:size+compressType+data
*/
//读取变量个数
int count = mSourceMemory.ReadInt(9);
......@@ -188,11 +205,39 @@ namespace Cdy.Tag
//源内存数据块头部信息偏移地址
int offset = 21;
//压缩后内存头大小
int headoffset = 16;
int mLastDataRegionId = -1;
Dictionary<int,long> Drids = new Dictionary<int, long>();
//记录每个数据区域内ID的个数
Dictionary<int, int> mDRcount = new Dictionary<int, int>();
//计算数据区域个数
for(int i=0;i<count;i++)
{
var id = mSourceMemory.ReadInt(offset);
var did = id / TagCountOneFile;
if (mLastDataRegionId != did)
{
Drids.Add(did, 0);
mDRcount.Add(did, 1);
mLastDataRegionId = did;
}
else
{
mDRcount[did]++;
}
offset += 12;
}
offset = 21;
//数据区头部指针偏移
int headoffset = 0;
//数据区起始地址
int mHeadAddress = -1;
//数据区地址
int mDataPosition = count * 8 + headoffset;
int mDataPosition = 12 + Drids.Count * 12;
mLastDataRegionId = -1;
for (int i=0;i<count;i++)
{
......@@ -200,26 +245,53 @@ namespace Cdy.Tag
var qaddr = mSourceMemory.ReadInt(offset + 4);
var len = mSourceMemory.ReadInt(offset + 8);
int rid = id / TagCountOneFile;
int size = 0;
if (rid != mLastDataRegionId)
{
//开启一个新的数据区域
if (mHeadAddress >= 0)
{
mTargetMemory.WriteInt(mHeadAddress, mDataPosition);//写入上一个区域数据块的大小
mTargetMemory.WriteInt(mHeadAddress + 4, mDRcount[mLastDataRegionId]);//写入变量个数
}
Drids[rid] = mHeadAddress = mDataPosition;
headoffset = mHeadAddress + 8;
mDataPosition = headoffset + mDRcount[rid] * 8 + 8;
mLastDataRegionId = rid;
}
//压缩数据
var size = CompressBlockMemory(qaddr, mDataPosition,len);
size = CompressBlockMemory(qaddr, mDataPosition, len);
//更新头部指针区域数据
//写入变量ID
mTargetMemory.WriteInt(headoffset,id);
mTargetMemory.WriteInt(headoffset, id);
//写入数据区地址
mTargetMemory.WriteInt(headoffset + 4, mDataPosition);
////写入数据区大小
//mTargetMemory.WriteInt(headoffset + 8, size);
offset += 12;
headoffset += 8;
//headoffset += 12;
offset += 12;
mDataPosition += size;
}
mTargetMemory.WriteInt(0, mDataPosition);//写入数据的大小
mTargetMemory.WriteInt(4, count);//写入变量数量
mTargetMemory.WriteDatetime(8, mCurrentTime);//写入时间
if (count > 0)
{
mTargetMemory.WriteInt(mHeadAddress, mDataPosition);//写入上一个区域数据块的大小
mTargetMemory.WriteInt(mHeadAddress + 4, mDRcount[mLastDataRegionId]);//写入变量个数
}
mTargetMemory.WriteInt(0, Drids.Count);
mTargetMemory.WriteDatetime(4, mCurrentTime);
//更新数据区域地址
offset = 12;
foreach (var vid in Drids)
{
mTargetMemory.WriteInt(offset, vid.Key);
mTargetMemory.WriteLong(offset+4, vid.Value);
offset += 12;
}
}
/// <summary>
......
......@@ -21,7 +21,7 @@ namespace Cdy.Tag
#region ... Variables ...
private Dictionary<int, YearTimeFile> mTimeFileMaps = new Dictionary<int, YearTimeFile>();
private Dictionary<int,Dictionary<int, YearTimeFile>> mTimeFileMaps = new Dictionary<int,Dictionary<int, YearTimeFile>>();
private string mDatabaseName;
......@@ -45,6 +45,11 @@ namespace Cdy.Tag
#region ... Properties ...
/// <summary>
/// 单个文件内变量的个数
/// </summary>
public int TagCountOneFile { get; set; }
#endregion ...Properties...
#region ... Methods ...
......@@ -68,7 +73,7 @@ namespace Cdy.Tag
{
foreach (var vv in dir.GetFiles())
{
if (vv.Extension == SeriseEnginer.DataFileExtends)
if (vv.Extension == SeriseFileItem.DataFileExtends)
{
ParseFileName(vv);
}
......@@ -86,10 +91,16 @@ namespace Cdy.Tag
/// <param name="fileName"></param>
private void ParseFileName(System.IO.FileInfo file)
{
string sname = file.Name.Replace(SeriseEnginer.DataFileExtends,"");
string sname = file.Name.Replace(SeriseFileItem.DataFileExtends,"");
string stime = sname.Substring(sname.Length - 12, 12);
int yy=0, mm=0, dd=0;
int id = -1;
int.TryParse(sname.Substring(sname.Length - 15, 3), out id);
if (id == -1)
return;
if (!int.TryParse(stime.Substring(0, 4),out yy))
{
return;
......@@ -112,14 +123,23 @@ namespace Cdy.Tag
YearTimeFile yt = new YearTimeFile() { TimeKey = yy };
if (mTimeFileMaps.ContainsKey(yy))
if(mTimeFileMaps.ContainsKey(id))
{
yt = mTimeFileMaps[yy];
if (mTimeFileMaps[id].ContainsKey(yy))
{
yt = mTimeFileMaps[id][yy];
}
else
{
mTimeFileMaps[id].Add(yy, yt);
}
}
else
{
mTimeFileMaps.Add(yy, yt);
mTimeFileMaps.Add(id, new Dictionary<int, YearTimeFile>());
mTimeFileMaps[id].Add(yy, yt);
}
yt.AddMonth(mm).AddDay(dd).AddHour(hh).AddMinutes().ForEach(e=> { e.AddFile(file.FullName); });
}
......@@ -129,11 +149,13 @@ namespace Cdy.Tag
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
public MinuteTimeFile GetFile(DateTime time)
public MinuteTimeFile GetFile(DateTime time,int Id)
{
if(mTimeFileMaps.ContainsKey(time.Year))
int id = Id / TagCountOneFile;
if (mTimeFileMaps.ContainsKey(id) && mTimeFileMaps[id].ContainsKey(time.Year))
{
return mTimeFileMaps[time.Year].GetFile(time);
return mTimeFileMaps[id][time.Year].GetFile(time);
}
return null;
}
......@@ -144,13 +166,13 @@ namespace Cdy.Tag
/// <param name="starttime"></param>
/// <param name="endtime"></param>
/// <returns></returns>
public List<MinuteTimeFile> GetFiles(DateTime starttime,DateTime endtime)
public List<MinuteTimeFile> GetFiles(DateTime starttime,DateTime endtime,int Id)
{
List<MinuteTimeFile> re = new List<MinuteTimeFile>();
DateTime sstart = starttime;
while (sstart <= endtime)
{
re.Add(GetFile(sstart));
re.Add(GetFile(sstart,Id));
sstart = sstart.AddMinutes(1);
}
return re;
......@@ -161,12 +183,12 @@ namespace Cdy.Tag
/// </summary>
/// <param name="times"></param>
/// <returns></returns>
public Dictionary<DateTime, MinuteTimeFile> GetFiles(List<DateTime> times)
public Dictionary<DateTime, MinuteTimeFile> GetFiles(List<DateTime> times,int Id)
{
Dictionary<DateTime,MinuteTimeFile> re = new Dictionary<DateTime, MinuteTimeFile>();
foreach(var vv in times)
{
re.Add(vv,GetFile(vv));
re.Add(vv,GetFile(vv,Id));
}
return re;
}
......
......@@ -56,7 +56,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id,List<DateTime> times,QueryValueMatchType type,HisQueryResult<bool> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach(var vv in vfiles)
......@@ -97,7 +97,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<byte> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -139,7 +139,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<short> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -180,7 +180,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<ushort> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -221,7 +221,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<int> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -262,7 +262,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<uint> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -303,7 +303,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<ulong> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -344,7 +344,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<long> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -387,7 +387,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<float> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -429,7 +429,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<double> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -471,7 +471,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<DateTime> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -512,7 +512,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadValue(int id, List<DateTime> times, QueryValueMatchType type, HisQueryResult<string> result)
{
var vfiles = GetFileManager().GetFiles(times);
var vfiles = GetFileManager().GetFiles(times, id);
MinuteTimeFile mPreFile = null;
List<DateTime> mtime = new List<DateTime>();
foreach (var vv in vfiles)
......@@ -553,7 +553,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id,DateTime startTime,DateTime endTime,HisQueryResult<bool> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime,id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart,out eend);
......@@ -570,7 +570,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<byte> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -587,7 +587,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<short> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -604,7 +604,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<ushort> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -621,7 +621,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<int> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -638,7 +638,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<uint> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -655,7 +655,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<long> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -672,7 +672,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<ulong> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -689,7 +689,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<float> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -706,7 +706,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<double> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -723,7 +723,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<DateTime> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......@@ -740,7 +740,7 @@ namespace Cdy.Tag
/// <param name="result"></param>
public void ReadAllValue(int id, DateTime startTime, DateTime endTime, HisQueryResult<string> result)
{
var vfiles = GetFileManager().GetFiles(startTime, endTime);
var vfiles = GetFileManager().GetFiles(startTime, endTime, id);
vfiles.ForEach(e => {
DateTime sstart, eend;
e.GetTimeSpan(startTime, endTime, out sstart, out eend);
......
......@@ -124,7 +124,7 @@ namespace Cdy.Tag
using (var ss = DataFileSeriserManager.manager.GetDefaultFileSersie())
{
ss.OpenFile(mDataFile);
long offset = SeriseEnginer.FileHeadSize;
long offset = SeriseFileItem.FileHeadSize;
DateTime time;
do
{
......
......@@ -54,58 +54,8 @@ namespace Cdy.Tag
private DateTime mCurrentTime;
//private DataFileSeriserbase mFileWriter;
//private MemoryBlock mHeadMemory;
private VarintCodeMemory mTagIdMemoryCach;
//变量ID校验和
private long mTagIdSum;
private int mTagCount = 0;
///// <summary>
///// 变量的数据指针的相对起始地址
///// </summary>
//private Dictionary<int,Dictionary<int, long>> mIdAddrs = new Dictionary<int, Dictionary<int, long>>();
private SeriseFileItem[] mSeriseFile;
/// <summary>
///
/// </summary>
private bool mNeedUpdateTagHeads = false;
/// <summary>
/// 当前数据区首地址
/// </summary>
private long mCurrentDataRegion = 0;
/// <summary>
/// 上一个数据区域首地址
/// </summary>
private long mPreDataRegion = 0;
/// <summary>
///
/// </summary>
private string mCurrentFileName = string.Empty;
/// <summary>
///
/// </summary>
private int mFileStartHour = 0;
/// <summary>
/// 数据文件扩展名
/// </summary>
public const string DataFileExtends = ".dbd";
/// <summary>
/// 文件头大小
/// </summary>
public const int FileHeadSize = 72;
#endregion ...Variables...
......@@ -143,7 +93,7 @@ namespace Cdy.Tag
/// <summary>
/// 单个文件内变量的个数
/// </summary>
public int TagCountOneFile { get; set; }
public int TagCountOneFile { get; set; } = 100000;
/// <summary>
/// 数据库名称
......@@ -177,56 +127,8 @@ namespace Cdy.Tag
mSeriseFile[i].FileWriter = DataFileSeriserManager.manager.GetSeriser(DataSeriser).New();
mSeriseFile[i].Init();
}
//mIdAddrs.Clear();
//long offset = GetDataRegionHeaderLength() + CalTagIdsSize();
//int blockcount = FileDuration * 60 / BlockDuration;
//var vv = ServiceLocator.Locator.Resolve<ITagQuery>();
//var tags = vv.ListAllTags().OrderBy(e => e.Id);
//double fileCount = tags.Count() / (TagCountOneFile*1.0);
//fileCount = Math.Floor(fileCount);
//for(int i=0;i<(int)fileCount;i++)
//{
// mIdAddrs.Add(i, new Dictionary<int, long>());
//}
//foreach (var vtag in tags)
//{
// mIdAddrs[vtag.Id/TagCountOneFile].Add(vtag.Id, offset);
// offset += (blockcount * 8);
//}
}
///// <summary>
///// 计算变量Id集合所占的大小
///// </summary>
///// <returns></returns>
//private int CalTagIdsSize()
//{
// if (mTagIdMemoryCach != null) mTagIdMemoryCach.Dispose();
// var aids = ServiceLocator.Locator.Resolve<ITagQuery>().ListAllTags().OrderBy(e => e.Id).ToArray();
// mTagIdSum = 0;
// mTagIdMemoryCach = new VarintCodeMemory((int)(aids.Count() * 4 * 1.2));
// if (aids.Length > 0)
// {
// int preids = aids[0].Id;
// mTagIdSum += preids;
// mTagIdMemoryCach.WriteInt32(preids);
// for (int i = 1; i < aids.Length; i++)
// {
// var id = aids[i].Id;
// mTagIdMemoryCach.WriteInt32(id - preids);
// mTagIdSum += id;
// preids = id;
// }
// }
// return mTagIdMemoryCach.Position + 4;
//}
/// <summary>
///
/// </summary>
......@@ -249,9 +151,6 @@ namespace Cdy.Tag
resetEvent.Set();
closedEvent.WaitOne();
//mIdAddrs.Clear();
//mFileWriter = null;
mProcessMemory = null;
foreach (var vv in mSeriseFile)
{
......@@ -259,8 +158,6 @@ namespace Cdy.Tag
}
mSeriseFile = null;
//mHeadMemory = null;
resetEvent.Dispose();
closedEvent.Dispose();
}
......@@ -295,222 +192,6 @@ namespace Cdy.Tag
closedEvent.Set();
}
///// <summary>
///// 搜索最后一个数据区域
///// </summary>
///// <returns></returns>
//private long SearchLastDataRegion()
//{
// long offset = FileHeadSize;
// while (true)
// {
// var nextaddr = mFileWriter.ReadLong(offset + 8);
// if (nextaddr <= 0)
// {
// break;
// }
// else
// {
// offset = nextaddr;
// }
// }
// mPreDataRegion = offset;
// mFileWriter.GoToEnd();
// mCurrentDataRegion = mFileWriter.Length;
// return 0;
//}
///// <summary>
/////
///// </summary>
///// <param name="time"></param>
///// <returns></returns>
//private string GetDataPath(DateTime time)
//{
// return System.IO.Path.Combine(PathHelper.helper.GetDataPath("HisData"),GetFileName(time));
//}
///// <summary>
///// 检查文件是否存在
///// </summary>
///// <param name="time"></param>
//private bool CheckFile(DateTime time)
//{
// if (!CheckInSameFile(time))
// {
// if (mNeedUpdateTagHeads)
// {
// Init();
// mNeedUpdateTagHeads = false;
// }
// mFileWriter.Flush();
// mFileWriter.Close();
// string sfile = GetDataPath(time);
// if (mFileWriter.CreatOrOpenFile(sfile))
// {
// AppendFileHeader(time, this.DatabaseName);
// //新建文件
// mCurrentDataRegion = FileHeadSize;
// mPreDataRegion = -1;
// AppendDataRegionHeader();
// }
// else
// {
// if (mFileWriter.Length < 8)
// {
// AppendFileHeader(time, this.DatabaseName);
// //新建文件
// mCurrentDataRegion = FileHeadSize;
// mPreDataRegion = -1;
// AppendDataRegionHeader();
// }
// else
// {
// //打开已有文件
// SearchLastDataRegion();
// AppendDataRegionHeader();
// }
// }
// }
// else
// {
// if (mNeedUpdateTagHeads)
// {
// Init();
// SearchLastDataRegion();
// AppendDataRegionHeader();
// mNeedUpdateTagHeads = false;
// }
// }
// return true;
//}
///// <summary>
/////
///// </summary>
///// <param name="time1"></param>
///// <param name="time2"></param>
///// <returns></returns>
//public bool CheckInSameFile(DateTime time1)
//{
// return GetFileName(time1) == mCurrentFileName;
//}
///// <summary>
/////
///// </summary>
///// <param name="time"></param>
///// <returns></returns>
//public string GetFileName(DateTime time)
//{
// return DatabaseName + time.ToString("yyyyMMdd") + FileDuration.ToString("D2") + (time.Hour/ FileDuration).ToString("D2")+ DataFileExtends;
//}
///// <summary>
/////
///// </summary>
///// <returns></returns>
//private int GetDataRegionHeaderLength()
//{
// //头部结构:Pre DataRegion(8) + Next DataRegion(8) + Datatime(8)+ tagcount(4)+ tagid sum(8)+file duration(4)+block duration(4)+Time tick duration(4)
// return 8 + 8 + 8 + 4 + 8 + 4 + 4 + 4;
//}
///// <summary>
/////
///// </summary>
//private void AppendFileHeader(DateTime time, string databaseName)
//{
// DateTime date = new DateTime(time.Year, time.Month, time.Day, ((time.Hour/FileDuration) * FileDuration), 0, 0);
// mFileWriter.Write(date, 0);
// byte[] nameBytes = new byte[64];
// var ntmp = Encoding.UTF8.GetBytes(databaseName);
// Buffer.BlockCopy(ntmp, 0, nameBytes, 0, Math.Min(64, ntmp.Length));
// mFileWriter.Write(nameBytes, 8);
//}
///// <summary>
/////
///// </summary>
//private void AppendDataRegionHeader()
//{
// var size = GeneratorDataRegionHeader();
// mFileWriter.Append(mHeadMemory.Buffers, 0, size);
// //更新上个DataRegion 的Next DataRegion Pointer 指针
// if (mPreDataRegion>=0)
// {
// mFileWriter.Write(mCurrentDataRegion, mPreDataRegion + 8);
// }
// mPreDataRegion = mCurrentDataRegion;
//}
///// <summary>
///// 生成文件头部
///// <paramref name="offset">偏移位置</paramref>
///// </summary>
//private int GeneratorDataRegionHeader()
//{
// //文件头部结构:Pre DataRegion(8) + Next DataRegion(8) + Datatime(8)+tagcount(4)+ tagid sum(8) +file duration(4)+ block duration(4)+Time tick duration(4)+ { len + [tag id]}+ [data blockpoint(8)]
// int blockcount = FileDuration * 60 / BlockDuration;
// int len = GetDataRegionHeaderLength() + mTagCount * (blockcount * 4);
// len += mTagIdMemoryCach.Position + 4;
// if (mHeadMemory != null)
// {
// if (len > mHeadMemory.Length)
// {
// mHeadMemory.ReAlloc(len);
// }
// else
// {
// mHeadMemory.Clear();
// }
// }
// else
// {
// mHeadMemory = new MemoryBlock(len);
// }
// mHeadMemory.Position = 0;
// mHeadMemory.Write((long)mPreDataRegion);//更新Pre DataRegion 指针
// mHeadMemory.Write((long)0); //更新Next DataRegion 指针
// mHeadMemory.Write(mCurrentTime); //写入时间
// mHeadMemory.Write(mTagCount); //写入变量个数
// mHeadMemory.Write(mTagIdSum); //写入Id 校验和
// mHeadMemory.Write(FileDuration); //写入文件持续时间
// mHeadMemory.Write(BlockDuration); //写入数据块持续时间
// mHeadMemory.Write(HisEnginer.MemoryTimeTick); //写入时间间隔
// //写入变量编号列表
// mHeadMemory.Write(mTagIdMemoryCach.Position);//写入压缩后的数组的长度
// mHeadMemory.Write(mTagIdMemoryCach.Buffer, 0, mTagIdMemoryCach.Position);//写入压缩数据
// return len;
//}
///// <summary>
///// 更新数据块文件指针
///// </summary>
///// <param name="id"></param>
///// <param name="datapointer"></param>
//public void UpdateDataBlockPointer(int id, long datapointer, DateTime dateTime)
//{
// int bindex = ((dateTime.Hour - mFileStartHour) * 60 + dateTime.Minute)/ BlockDuration;
// int icount = id / TagCountOneFile;
// long ids = mCurrentDataRegion + mIdAddrs[icount][id] + bindex * 8; //当前数据区域地址+数据指针的起始地址+指针偏移
// mFileWriter.Write(BitConverter.GetBytes(datapointer), ids);
//}
/// <summary>
/// 执行存储到磁盘
/// </summary>
......@@ -535,58 +216,8 @@ namespace Cdy.Tag
Parallel.ForEach(memoryAddrs, (keyval) => {
mSeriseFile[keyval.Key].SaveToFile(mProcessMemory, keyval.Value,mCurrentTime);
});
//var totalsize = mProcessMemory.ReadInt(0);
//var count = mProcessMemory.ReadInt(4);
//var time = mProcessMemory.ReadDateTime(8);
//mTagCount = count;
//mCurrentTime = time;
//int offset = 16;
////判断变量的ID列表是否被修改了
//for (int i=0;i<count;i++)
//{
// var id = mProcessMemory.ReadInt(offset);
// if(!mIdAddrs.ContainsKey(id))
// {
// mNeedUpdateTagHeads = true;
// break;
// }
// offset += 8;
//}
//if (!CheckFile(time))
// return;
//offset = 16;
//int start = count * 8 + offset;//计算出数据起始地址
//this.mFileWriter.Append(mProcessMemory.Buffers, start, totalsize - start); //直接拷贝数据块
//var pos = mFileWriter.CurrentPostion;
//mFileStartHour = time.Hour / FileDuration;
//for (int i = 0; i < count; i++)
//{
// var id = mProcessMemory.ReadInt(offset);
// offset += 4;
// var addr = mProcessMemory.ReadInt(offset) + mCurrentDataRegion;
// offset += 4;
// UpdateDataBlockPointer(id, addr,time);
//}
//mCurrentDataRegion = pos;
//Flush();
}
///// <summary>
/////
///// </summary>
//public void Flush()
//{
// mFileWriter.Flush();
//}
#endregion ...Methods...
#region ... Interfaces ...
......@@ -989,7 +620,6 @@ namespace Cdy.Tag
var totalsize = mProcessMemory.ReadInt(dataOffset);
var count = mProcessMemory.ReadInt(dataOffset + 4);
//var time = mProcessMemory.ReadDateTime(dataOffset + 8);
mTagCount = count;
mCurrentTime = time;
long offset = 8 + dataOffset;
......
......@@ -133,6 +133,7 @@ namespace Cdy.Tag
InitPath();
mHisFileManager = new DataFileManager(mDatabaseName);
mHisFileManager.TagCountOneFile = mHisDatabase.Setting.TagCountOneFile;
var task = mHisFileManager.Int();
......@@ -147,6 +148,7 @@ namespace Cdy.Tag
hisEnginer.Init();
compressEnginer = new CompressEnginer(hisEnginer.CurrentMemory.Length);
compressEnginer.TagCountOneFile = mHisDatabase.Setting.TagCountOneFile;
seriseEnginer = new SeriseEnginer() { DatabaseName = database };
seriseEnginer.FileDuration = mHisDatabase.Setting.FileDataDuration;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册