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

来源:互联网 发布:php 编译扩展 编辑:程序博客网 时间:2024/05/21 01:29

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            }

原创粉丝点击