我用了内存映射机制,然后一行一行读取,然后填入MAP标准容器,用了15秒。[CPU C4 2.4G 512内存]可我发现金山词霸,加载词典的速度5秒都不到,他那个词典有173MB大。他是如何做到的?内存映射,好像不是想像中那么快呢?我现在正尝试做个词典查询小程序。

解决方案 »

  1.   

    我也做过词典的小程序
    当时词典的格式为4    Byte 单词数量
    2*26 Byte 以每个字母开头的单词的索引
    4*单词数量 每个单词在文件中的时间位置输入时,比如输入c
    我就读取4+2*2  (C-A)处的2个byte,得到C字母的开始的单词的索引,比如672
    再读取4+2*3 (D-A)处的2个Byte,得到D字母开头的单词的索引,比如973
    如果再输入一个字母,比如ch
    再用二分查找法查找672和973-1之间的单词
    好像速度也不慢
      

  2.   

    我利用的就是MAP标准容器,MAP采用平衡2叉树,搜索不慢。我测试过100万行内容加入到MAP标准容器后,搜索MAP的KEY,只用毫秒来计算。但是,我问题是,假如我有173MB那么大的词典内容,这些信息如何存放? 然后在读取内容放入MAP标准容器中。现在就是读取文本内容的速度不快 。金山糍粑,是如何做到的 ?金山的词典,到底怎么加载进内存,或者是何时才开始加载, 加载时,加载多大 ?
      

  3.   

    其实MAP标准容器的KEY也就是索引. 这个你们说的我都不成问题.但问题是, 有了索引,如何通过索引定位到目标内容呢?因为词典有上百MB ,打开文本到定位到目标内容再读取出来,这个就是关键了.
    你要在上百MB的大小去定位到一个目标内容,困难呀.除非把上百MB内容进行内存映射.要么分片内容映射了,也就是说 索引是属于哪个部分,就针对该部分进行内存映射. 而且不用映射完.我估计金山是 分多个小文件存储. 因为我看过金山的词典文件夹有很多个文本文件.但是,我打开看,里面的内容是加密的.呵呵.
     
      

  4.   

    你如果用行号来作为索引就是你设计上的问题。为什么不考虑用数据库呢?
    -------------------------------------------------------
    MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)  
    可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
    下载地址:http://nj.onlinedown.net/soft/6591.htm
      

  5.   

    TO zx_sanjin((恒金软件)-不结贴我跟你急!) 
      我是这样想的,当数据小的时候,按行读取 ,是没有问题.
      然后数据量大的时候,我就是利用内存映射,然后按1个1个字节解析.如果采用数据库的话,好像失去词典的味道了吧.主要是想自己实现一个词典,看看有没有比金山更快的方法.
      

  6.   

    问题是,金山本来就没有加载全部的数据.一启动加载一千几百行就可以了.到你输入后,用SQL语句的LIKE查,方便得很.只是如果有人那么傻,比如他不查,而是一直向下拉一个一个看的话,就比较麻烦.方法也很简单,索引前+500后+500,呵