C#实现的内存分页机制的一个实例

//多页索引表管理类(全局主索引表管理类)
public class MuliPageIndexFeatureClass : IDisposable
{
protected List<IndexPageClass> MuliPageIndexTable = new List<IndexPageClass>(); //多页索引表对象
//
protected int CurrentMemoryPageIndex = -1; //当前内存索引页(已载入内存的索引页的对象)
public int PerPageDwCount = 30000; //每页地物个数 default=3,0000 /// <summary>
/// = Application.StartupPath + "\\tempfiles\\tmp_vct";
/// </summary>
protected string tmpDir = Application.StartupPath + "\\tempfiles\\tmp_vct"; public MuliPageIndexFeatureClass()
{
this.MemoryPageList.Clear();
//txt存放目录
string dir = this.tmpDir;
if (System.IO.Directory.Exists(dir) == true)
{
try
{
System.IO.Directory.Delete(dir, true);
}
catch { }
}
if(System.IO.Directory.Exists(dir) == false)
{
System.IO.Directory.CreateDirectory(dir);
}
} //创建多页索引表(建立多页索引表) 派生类需重写
private IndexPageClass tmpIP = null;
public virtual bool CreateMuliPageIndexTable(FeatureOIDMap pfeat)
{
//txt存放目录
string dir = this.tmpDir;
if (System.IO.Directory.Exists(dir) == false)
{
System.IO.Directory.CreateDirectory(dir);
}
//创建多页索引表....
if (this.tmpIP == null)
{ //产生一个新的索引页面
this.tmpIP = new IndexPageClass();
tmpIP.RelationFileName = "vctline" + this.MuliPageIndexTable.Count.ToString() + ".txt";
tmpIP.CreatedIndex = false;
tmpIP.OpenTxt();
this.MuliPageIndexTable.Add(tmpIP);
}
else
{
if (tmpIP.dt.Count >=this.PerPageDwCount)
{ //保存原有的索引页面
tmpIP.SaveToTxt();
tmpIP.CloseTxt();
tmpIP.CreatedIndex = true;
tmpIP.dt.Clear();
//产生一个新的索引页面
tmpIP = new IndexPageClass();
tmpIP.RelationFileName = "vctline" + this.MuliPageIndexTable.Count.ToString() + ".txt";
tmpIP.CreatedIndex = false;
tmpIP.OpenTxt();
this.MuliPageIndexTable.Add(tmpIP);
}
}
if(tmpIP!=null)
{
tmpIP.dt.Add(pfeat.ObjectID,pfeat);
if (tmpIP.dt.Count % 100==0)
{
Application.DoEvents();
}
}
return true;
}
public virtual bool SaveEndPageIndexTable()
{
bool rbc = false;
if (tmpIP != null)
{
tmpIP.SaveToTxt();
tmpIP.CloseTxt();
tmpIP.CreatedIndex = true;
tmpIP.dt.Clear();
tmpIP.Dispose();
tmpIP = null;
rbc = true;
}
return rbc;
} //选择记录集 OK
private List<int> MemoryPageList = new List<int>();
private int MemoryPagesOnLine = 7; //在线的内存索引文件数
public FeatureOIDMap GetLine(int bsm)
{
FeatureOIDMap feat = null;
bool IsSearch = true; //是否要进行分页搜索操作标志 默认为是 if (this.CurrentMemoryPageIndex != -1)
{ //当前内存分页中是否有dwID地物唯一编号
if (this.MuliPageIndexTable[this.CurrentMemoryPageIndex].DwidList.Contains(bsm) == true)
{
IsSearch = false;
}
} if (IsSearch == true)
{ //进行分页搜索操作 并置为当前内存分页
for (int i = 0; i < this.MuliPageIndexTable.Count; i++)
{
if (this.MuliPageIndexTable[i].DwidList.Contains(bsm) == true)
{
if (this.CurrentMemoryPageIndex != i)
{
//需搜索页面不在当前内存页面中 (需置换页面)
if (this.CurrentMemoryPageIndex != -1)
{
//修正在线内存索引文件个数
if (this.MemoryPageList.Contains(i) == false)
{
this.MemoryPageList.Add(i);
}
if (this.MemoryPageList.Contains(this.CurrentMemoryPageIndex) == false)
{
this.MemoryPageList.Add(this.CurrentMemoryPageIndex);
}
if (this.MemoryPageList.Count > this.MemoryPagesOnLine)
{
this.MemoryPageList.RemoveAt(0);
}
//清除离线内存索引文件中坐标大数据 for (int k = 0; k < this.MuliPageIndexTable.Count; k++)
{
if (this.MemoryPageList.Contains(k) == false)
{
this.MuliPageIndexTable[k].Dispose();
}
}
}
if (this.MuliPageIndexTable[i].dt.Count <= 0)
{
this.MuliPageIndexTable[i].ReadFromTxt(); //从txt文件中读取记录
}
this.CurrentMemoryPageIndex = i;
break;
}
} //end if
} //end for
} //当前分面页页进行搜索...
if (this.CurrentMemoryPageIndex != -1)
{
feat = this.MuliPageIndexTable[this.CurrentMemoryPageIndex].GetLine(bsm);
}
return feat;
} //获取一页索引表
public IndexPageClass GetIndexPageClass(int index)
{
if (MuliPageIndexTable != null && this.MuliPageIndexTable.Count > index)
{
return this.MuliPageIndexTable[index];
}
return null;
} public void Clear()
{
this.Dispose();
}
#region IDisposable 成员 public void Dispose()
{
if (this.MuliPageIndexTable.Count > 0)
{
for (int i = 0; i < this.MuliPageIndexTable.Count; i++)
{
this.MuliPageIndexTable[i].Dispose();
}
}
this.MuliPageIndexTable.Clear();
this.CurrentMemoryPageIndex = -1;
} public void DeleteTempFile()
{
//分页对应的txt文件...
string dir = this.tmpDir;
if (System.IO.Directory.Exists(dir) == true)
{
try
{
System.IO.Directory.Delete(dir, true);
}
catch
{
}
}
} #endregion
}
//一页内索引表管理类
public class IndexPageClass : IDisposable
{
public bool CreatedIndex = false;
public List<int> DwidList = new List<int>(); //地物唯一编号的集合
public string RelationFileDir = Application.StartupPath + "\\tempfiles\\tmp_vct";
//相关的txt文件 dltb_xzdw_Relation_1.txt
public string RelationFileName = "";
//排序后的记录关系记录DataRow集合 //从_1.txt从读取内容
protected FeatureOIDMapCollection m_dt = new FeatureOIDMapCollection();
protected System.IO.StreamWriter sw = null;
private int m_index = 0; //get dt
public FeatureOIDMapCollection dt
{
get
{
return m_dt;
}
} /// <summary>
/// //打开文本分页文件写入流
/// </summary>
public bool OpenTxt()
{
string relfilename = this.RelationFileDir + "\\" + this.RelationFileName;
if (System.IO.File.Exists(relfilename) == true)
{
System.IO.File.Delete(relfilename);
}
this.sw = new StreamWriter(relfilename, true, Encoding.Default);
return true;
} /// <summary>
/// 向写入流写入一行记录
/// </summary>
private bool AppentLine(string pLine)
{
if (this.sw != null)
{
this.sw.WriteLine(pLine);
this.m_index += 1; if (this.m_index % 10000 == 0)
{
this.sw.Flush();
Application.DoEvents();
}
}
return true;
}
/// <summary>
/// 向写入流写入一行记录
/// </summary>
private bool AppentLine(FeatureOIDMap pFeatureOIDMap)
{
StringBuilder pline = new StringBuilder();
CoPointClass cpoint = null;
//常住内存索引
this.DwidList.Add(pFeatureOIDMap.ObjectID);
//
pline.Append(pFeatureOIDMap.ObjectID.ToString());
for (int i = 0; i < pFeatureOIDMap.PointArray.Count; i++)
{
cpoint=pFeatureOIDMap.PointArray[i] as CoPointClass;
pline.Append("," + cpoint.X.ToString() + "," + cpoint.Y.ToString());
}
return AppentLine(pline.ToString());
} //保存到txt文件中
public bool SaveToTxt()
{
bool rbc = false;
if (this.dt != null)
{
foreach(FeatureOIDMap featmap in this.dt.Values)
{
this.AppentLine(featmap);
}
rbc = true;
}
return rbc;
} /// <summary>
/// 关闭写入流
/// </summary>
public bool CloseTxt()
{
if (sw != null)
{
sw.Flush();
sw.Close();
sw.Dispose();
sw = null;
}
return true;
} //从txt中读取记录到m_dt表中 OK
public virtual bool ReadFromTxt()
{
this.Dispose();
int t_index = 0;
int bsm=0;
double x = 0;
double y = 0;
System.IO.StreamReader sr = new System.IO.StreamReader(this.RelationFileDir + "\\" + this.RelationFileName, Encoding.Default);
string line = sr.ReadLine();
while (line != null && line != "")
{
t_index += 1;
if (t_index % 100 == 0)
{
Application.DoEvents();
}
//向m_dt中加入一行记录
string[] lineArray = line.Split(new char[] { ',' });
bsm=int.Parse(lineArray[0]);
FeatureOIDMap feat_new = new FeatureOIDMap(bsm);
for (int i = 1; i < lineArray.Length; i+=2)
{
CoPointClass xpPoint = new CoPointClass();
x = 0;
y = 0;
double.TryParse(lineArray[i], out x);
double.TryParse(lineArray[i+1], out y);
xpPoint.X = x;
xpPoint.Y = y;
//
feat_new.PointArray.Add(xpPoint);
}
this.m_dt.Add(feat_new.ObjectID,feat_new);
//
line = sr.ReadLine();
}
sr.Close();
sr.Dispose();
sr = null;
return true;
} //从内存页面中选择记录集 OK
public FeatureOIDMap GetLine(int bsm)
{
FeatureOIDMap feat = null;
if (m_dt != null && m_dt.Count <= 0)
{
this.ReadFromTxt();
}
if (m_dt != null && m_dt.Count > 0)
{
feat = this.m_dt.GetIndexByOID(bsm);
}
return feat;
} #region IDisposable 成员 public void Dispose()
{
if (m_dt != null)
{
m_dt.Clear();
}
}
#endregion
}

C#实现的内存分页机制的一个实例的更多相关文章

  1. CPU内存管理和linux内存分页机制

    一.概念 物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应.——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理 ...

  2. Oracle 分页查询的一个实例

    1.分页模板 select * from ( select rownum as rn , a.* from( 某个表名) a) where rn between 0 and 6 2 某个表名 sele ...

  3. 操作系统:x86下内存分页机制 (1)

    前置知识: 分段的概念(当然手写过肯定是坠吼的 为什么要分页 当我们写程序的时候,总是倾向于把一个完整的程序分成最基本的数据段,代码段,栈段.并且普通的分段机制就是在进程所属的LDT中把每一个段给标识 ...

  4. mysql通过“延迟关联”进行limit分页查询优化的一个实例

    最近在生产上遇见一个分页查询特别慢的问题,数据量大概有200万的样子,翻到最后一页性能很低,差不多得有4秒的样子才能出来整个页面,需要进行查询优化. 第一步,找到执行慢的sql,如下: SELECT  ...

  5. Linux内存寻址之分段机制及分页机制【转】

    前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...

  6. Intel微处理器学习笔记(四) 内存分页

    内存分页机制(memory paging mechanism)是从386开始的.线性地址通过分页机制透明转换为物理地址. 从这里知道:1. 如果不分页,则线性地址等于物理地址:2. 如果分页,则线性地 ...

  7. Linux内存管理机制简析

    Linux内存管理机制简析 本文对Linux内存管理机制做一个简单的分析,试图让你快速理解Linux一些内存管理的概念并有效的利用一些管理方法. NUMA Linux 2.6开始支持NUMA( Non ...

  8. x86 分页机制——虚拟地址到物理地址寻址

    x86下的分页机制有一个特点:PAE模式 PAE模式 物理地址扩展,是基于x86 的服务器的一种功能,它使运行 Windows Server 2003, Enterprise Edition 和 Wi ...

  9. Linux内存寻址之分页机制

    在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...

随机推荐

  1. 一个人的旅行(用小技巧转化为dijkstra算法)

    注意: 1:因为两点之间可能有多条路,所以更新路径长度的时候做一次判断 if(time < mat[a][b]) mat[a][b] = mat[b][a] = time; 2:因为主函数中的数 ...

  2. new,delete,malloc,free

    malloc/free是C语言中的内存申请和释放函数,利用它们可方便地管理内存.而在C++中我们又有了新的工具:new/delete.new/delete在管理内存的同时会调用类的构造函数和析构函数, ...

  3. JSP三大常用对象request、response、session

    1.request对象 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求, 然后做出响应.它是HttpServletRequest类的实例. 序号方法说明 objectgetA ...

  4. css2实现尖角箭头式导航

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  5. 一、ThinkPHP的介绍

    一.ThinkPHP的介绍 //了解 MVC M - Model 模型 工作:负责数据的操作 V - View 视图(模板) 工作:负责前台页面显示 编写html代码 C - Controller 控 ...

  6. Git安装及基本使用

    准备: Git软件,github账号. Git安装: 直接百度搜git下载,windows和mac不同平台的.官网上的下载地址很慢或者根本下不了. 默认配置安装. github: 网址:https:/ ...

  7. 套接字socket 的地址族和类型、工作原理、创建过程

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  8. dos下遍历目录和文件的代码(主要利用for命令)

    对指定路径指定文件进行遍历的程序,这里有多个批处理代码,但运行好像有些问题,大家可以根据需要选择 ===== 文件夹结构 ======================================= ...

  9. sql 月初和月末

    --月初 select  convert(varchar(10),dateadd(day,-(day(getdate()) -1),getdate()) ,120) --月末select  conve ...

  10. 如果DataGrid的checkbox出现点一个另外自动点另一个现象

    如果DataGrid的checkbox出现点一个另外自动点另一个现象: 取消(EnableRowVirtualization)这个选项就可以正常了(关闭虚拟UI):