博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用偏移量快速定位数据内容
阅读量:4698 次
发布时间:2019-06-09

本文共 5055 字,大约阅读时间需要 16 分钟。

本项目需要把数据存档位二进制文件,载入时只载入文件索引,通过索引,快速定位到数据内容,从而实现最小存储,最快速查找。下面代码是初步实现,通过扩展,还实现搜索引擎关键字匹配度,权重,分词效果,这是后话,先把最基础的通过偏移量快速查找分享下。

 

///     /// 索引文件结构    ///     struct Token    {        ///         /// 关键字        ///         public string ID;        ///         /// 移偏量        ///         public int Offset;        ///         /// 长度        ///         public int Length;    }

  

///     /// 搜索    ///     class Search    {        private static StringBuilder _mainContent = new StringBuilder();        //生成索引文件和数据文件        public void BuildFile()        {            //生成索引文件            if (File.Exists("index.txt"))                File.Delete("index.txt");            using (FileStream aFile = new FileStream("index.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))            {                Random rd = new Random();                int rdv = 0;                byte[] bytes = null;                byte[] byCont = null;                int offset = 0;                int len = 0;                using (BinaryWriter bw = new BinaryWriter(aFile, Encoding.UTF8))                {                    for (int i = 0; i < 15; i++)                    {                        rdv = rd.Next(10, 305000);                        string indexerid = string.Empty;                        indexerid = i.ToString() + DateTime.Today.ToString("yyyyMMdd");                        _mainContent.Append(indexerid + "|test programe" + rdv.ToString());                        string result = indexerid + "|test programe" + rdv.ToString();                        bytes = System.Text.Encoding.UTF8.GetBytes(_mainContent.ToString()); //所有内容                        byCont = System.Text.Encoding.UTF8.GetBytes(result);  //本次内容                        //计算偏移量和内容长度                        if (i == 0)                        {                            offset = 0;                            len = byCont.Length;                        }                        else                        {                            offset = bytes.Length - byCont.Length;                            len = byCont.Length;                        }                        bw.Write(indexerid + "," + (offset) + "," + (len));                        bw.Flush();                    }                }            }            //生成数据文件            if (File.Exists("data.txt"))                File.Delete("data.txt");            using (FileStream dFile = new FileStream("data.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))            {                Random rd = new Random();                byte[] bytes = null;                using (BinaryWriter bw = new BinaryWriter(dFile, Encoding.UTF8))                {                    bytes = System.Text.Encoding.Default.GetBytes(_mainContent.ToString());                    bw.Write(_mainContent.ToString());                    bw.Flush();                }            }        }     //加载索引表到内存        public Dictionary
GetTokenDic() { Dictionary
dic = new Dictionary
(); using (FileStream aFile = new FileStream("index.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (BinaryReader bw = new BinaryReader(aFile, Encoding.UTF8)) { for (int i = 0; i < 15; i++) { string result = bw.ReadString(); if (result.IndexOf(',') != -1) { string[] arr = result.Split(','); Token token = new Token(); token.ID = arr[0]; token.Length = Convert.ToInt32(arr[2]); token.Offset = Convert.ToInt32(arr[1]); dic.Add(arr[0], token); } } } } return dic; } //根据关键字,通过偏移量快速查找内容 public void ReadFile(string key) { Dictionary
dic = GetTokenDic(); //char[] charData = null; FileStream file = new FileStream("data.txt", FileMode.Open); int dOffset = 0; int dLen = 0; Token t = new Token(); if (dic.TryGetValue(key, out t)) { dOffset = t.Offset; dLen = t.Length; } byte[] byData = new byte[dLen]; using (BinaryReader bw = new BinaryReader(file, Encoding.UTF8)) { file.Seek(dOffset + 2, SeekOrigin.Begin); file.Read(byData, 0, dLen); string d = Encoding.UTF8.GetString(byData); Console.WriteLine(d); file.Close(); } } }

  

static void Main(string[] args)        {            Search s = new Search();            //s.BuildFile();            s.ReadFile("1420130825");            Console.Read();        }

  

转载于:https://www.cnblogs.com/kevinke/p/3281627.html

你可能感兴趣的文章
【Javascript】: for循环中定义的变量在for循环体外也有效
查看>>
C++中memcpy和memmove
查看>>
实验吧编程 -找素数
查看>>
Dasha and Photos CodeForces - 761F (前缀优化)
查看>>
GLPK下载安装
查看>>
const变量赋值报错分析
查看>>
去空格和空白文本
查看>>
css制作圣诞树
查看>>
字符串常量池
查看>>
红白球与小明
查看>>
查看sqlserver被锁的表以及如何解锁
查看>>
ViewPager 详解(一)---基本入门
查看>>
伪类和伪元素的区别
查看>>
poj2248——Addition Chains(迭代加深搜索)
查看>>
JS屏蔽右键菜单和禁止刷新F5
查看>>
在Linux上搭建Hadoop
查看>>
Python实例---模拟微信网页登录(day4)
查看>>
android入门——BroadCast(2)
查看>>
配置maven
查看>>
使用Xshell连接Ubuntu
查看>>