作者jacky1989 ()
看板C_and_CPP
标题[讨论] 关於读入档案做後续处理
时间Wed Oct 5 01:28:54 2016
最近在写程式时遇到一个疑问,想提出来大家讨论看看,看怎样做比较好
我有一个文字档,里面大概有20几万行的资料
内容大概是这样,某一个item,後面有一组数值
a 5
b 6
c 79
...
那我今天要对这个文字档做搜寻的动作,而搜寻的关键字大概有7-8个
我以结构的方式储存这些关键字与其相关的值
这时候我考量到一个问题,因为文字档有20几万行,那要搜寻7-8次
1.会直接用while-loop方式,从头搜寻到尾,然後以fseek的方式,将档案指标指回
档案起始位置
2.会搜寻完一次先fclose,然後再fopen一次
3.将档案内容先全部读进来记忆体,并且以资料串结方式储存
我这人是用3,因为以我的认知,档案读写虽然有经过缓冲区,但是还是必须对硬碟存取
那搜寻7-8次,就得存取超多超多次
如果我只对档案存取一次,接着就是对记忆体做读写,是否会比较快一点呢??
这次叙述说真的,不是很清楚,我承认我不太会表达我想表达的
所以如果有需要补充的,请告诉我
感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.228.250.47
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1475602137.A.B2B.html
1F:→ Schottky: 也不需要读 8 次档,也用不着全部读进来储存 10/05 01:31
2F:→ Schottky: 一次读一行,用 8 个关键字都搜过,再读下一行就好 10/05 01:32
这样子阿~~~我还真的突然没想到这个方法,感谢指教
※ 编辑: jacky1989 (61.228.250.47), 10/05/2016 01:33:50
3F:→ Schottky: 这样缓冲区的效果也很好,你写起程式也很方便 10/05 01:33
4F:→ Schottky: 回到你问的问题,当然整个档案读进记忆体再料理比较快 10/05 01:44
5F:→ Schottky: 反正输入档也很小,20 万行大概 20MB 而已,OK 的 10/05 01:45
6F:→ Schottky: 如果输入档有 4GB 那就会开始遇到一些额外的麻烦事了 10/05 01:46
7F:推 CaptainH: 可以先sort再binary search 10/05 11:45
8F:推 james732: 如果关键字有唯一性的话我会想建字典 10/05 11:53
9F:→ MOONRAKER: shell grep 喔耶 10/05 13:57
10F:推 longlongint: grep 或 写个 inverse index table 10/05 20:08
11F:推 longlongint: 不过还是推个1楼 现阶段最实用 10/05 20:12