[
![]() |
最近几天都在思考重构 历史上的今天。
总体来说,这个问题需要处理的1万条左右的文本,总长度有10MB左右,很自然我们需要对数据做一个索引。对于这个具体的问题,我们需要的索引数据是{发生时间+事件标题+内容偏移量+内容长度},但是这里有一个问题,采用定长的索引,势必标题这个变长的数据不好处理,会浪费不少的磁盘空间和内存空间。但是如果采用变长的索引,在读取的时候会带来繁琐和低效。最终我采用的是定长的索引,不过额外引入了一个标题池,即:每条索引={发生事件+标题偏移量+内容偏移量+内容长度},索引文件分位三部分:{记录条数n+n条定长的索引+标题池},那么我们读取的时候就非常简单了:
1)读取记录条数n
2)分配n条索引的空间给,从文件中直接读入n条索引
3)分配标题池,空间=文件长度-当前文件位置,从文件中直接读入标题池
对于索引的生成,需要分两步,第一步写{记录条数n + n条定长索引},注意索引在写入的时候,动态计算它的标题偏移量;第二步写标题池,直接遍历一次写入。
在PPC上的运行结果非常令人满意,不过这个索引跑得还真是够慢,哈哈,当然瓶颈是在于磁盘读写:)
总体来说,这个问题需要处理的1万条左右的文本,总长度有10MB左右,很自然我们需要对数据做一个索引。对于这个具体的问题,我们需要的索引数据是{发生时间+事件标题+内容偏移量+内容长度},但是这里有一个问题,采用定长的索引,势必标题这个变长的数据不好处理,会浪费不少的磁盘空间和内存空间。但是如果采用变长的索引,在读取的时候会带来繁琐和低效。最终我采用的是定长的索引,不过额外引入了一个标题池,即:每条索引={发生事件+标题偏移量+内容偏移量+内容长度},索引文件分位三部分:{记录条数n+n条定长的索引+标题池},那么我们读取的时候就非常简单了:
1)读取记录条数n
2)分配n条索引的空间给,从文件中直接读入n条索引
3)分配标题池,空间=文件长度-当前文件位置,从文件中直接读入标题池
对于索引的生成,需要分两步,第一步写{记录条数n + n条定长索引},注意索引在写入的时候,动态计算它的标题偏移量;第二步写标题池,直接遍历一次写入。
在PPC上的运行结果非常令人满意,不过这个索引跑得还真是够慢,哈哈,当然瓶颈是在于磁盘读写:)
NetSniffer
2006/09/19 01:55
数据库创建的时候一次性把整个数据库文件大小定好(根据索引,字段大小,数据库最大条数),固定的空间换取效率。
分页: 1/1
1

