一个普通文本记录有50~100万行信息,共150~250MB大。按行读取内容,用什么方案最快?[讨论] 我用了内存映射机制,然后一行一行读取,然后填入MAP标准容器,用了15秒。[CPU C4 2.4G 512内存]可我发现金山词霸,加载词典的速度5秒都不到,他那个词典有173MB大。他是如何做到的?内存映射,好像不是想像中那么快呢?我现在正尝试做个词典查询小程序。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也做过词典的小程序当时词典的格式为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之间的单词好像速度也不慢 我利用的就是MAP标准容器,MAP采用平衡2叉树,搜索不慢。我测试过100万行内容加入到MAP标准容器后,搜索MAP的KEY,只用毫秒来计算。但是,我问题是,假如我有173MB那么大的词典内容,这些信息如何存放? 然后在读取内容放入MAP标准容器中。现在就是读取文本内容的速度不快 。金山糍粑,是如何做到的 ?金山的词典,到底怎么加载进内存,或者是何时才开始加载, 加载时,加载多大 ? 其实MAP标准容器的KEY也就是索引. 这个你们说的我都不成问题.但问题是, 有了索引,如何通过索引定位到目标内容呢?因为词典有上百MB ,打开文本到定位到目标内容再读取出来,这个就是关键了.你要在上百MB的大小去定位到一个目标内容,困难呀.除非把上百MB内容进行内存映射.要么分片内容映射了,也就是说 索引是属于哪个部分,就针对该部分进行内存映射. 而且不用映射完.我估计金山是 分多个小文件存储. 因为我看过金山的词典文件夹有很多个文本文件.但是,我打开看,里面的内容是加密的.呵呵. 你如果用行号来作为索引就是你设计上的问题。为什么不考虑用数据库呢?-------------------------------------------------------MyCSDN - CSDN离线数据浏览工具。(恒金软件出品) 可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。下载地址:http://nj.onlinedown.net/soft/6591.htm TO zx_sanjin((恒金软件)-不结贴我跟你急!) 我是这样想的,当数据小的时候,按行读取 ,是没有问题. 然后数据量大的时候,我就是利用内存映射,然后按1个1个字节解析.如果采用数据库的话,好像失去词典的味道了吧.主要是想自己实现一个词典,看看有没有比金山更快的方法. 问题是,金山本来就没有加载全部的数据.一启动加载一千几百行就可以了.到你输入后,用SQL语句的LIKE查,方便得很.只是如果有人那么傻,比如他不查,而是一直向下拉一个一个看的话,就比较麻烦.方法也很简单,索引前+500后+500,呵 关于debug assertion failed的问题,急!!! 写一个自己的桌面管理程序 如何得到某个菜单项的屏幕坐标? tcp数据偶尔丢失,真奇怪?? 使用CListCtrl时的诡异问题!!! 双击关联文件时,如何调用已经运行的程序实例打开该文件. 屏保的属性对话框是怎么实现的? 考研还是程序员 怎样激活变灰的Button? Access中新建表时,导入表的功能怎样在vc中实现? 想问一个主线程,生成两个子线程,两个子线程间如何通讯?哪位有例子,并大概说一下,笨,不懂呀! 百分求CWnd::SubclassWindow(HWND hWnd)函数的含义和具体用法!
当时词典的格式为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之间的单词
好像速度也不慢
你要在上百MB的大小去定位到一个目标内容,困难呀.除非把上百MB内容进行内存映射.要么分片内容映射了,也就是说 索引是属于哪个部分,就针对该部分进行内存映射. 而且不用映射完.我估计金山是 分多个小文件存储. 因为我看过金山的词典文件夹有很多个文本文件.但是,我打开看,里面的内容是加密的.呵呵.
-------------------------------------------------------
MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)
可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
下载地址:http://nj.onlinedown.net/soft/6591.htm
我是这样想的,当数据小的时候,按行读取 ,是没有问题.
然后数据量大的时候,我就是利用内存映射,然后按1个1个字节解析.如果采用数据库的话,好像失去词典的味道了吧.主要是想自己实现一个词典,看看有没有比金山更快的方法.