我有一个文本文件,用于保存文件和单词(及其频率)的索引。我需要将文件读入内存并存储单词,以便搜索它们。该文件的格式如下:
<files> 169
0:file0.txt
1:file1.txt
2:file2.txt
3:file3.txt
... etc ...
</files>
<list> word 2
9: 10
1: 2
</list>
<list> word2 4
3: 19
5: 12
0: 2
8: 2
</list>
... etc ...
问题是这个索引文件可能变得非常大,并且不会一次完全适合内存。我的解决方案是一次只将一小部分存储在HashTable中,然后当我需要获取另一个单词的数据时,我会抛出一个旧单词,然后从文件中解析新单词的数据。
如何在C中有效地完成此操作?我想在得到某些要点后,我必须用fseek和倒带来做点什么。
谢谢,
麦克
答案 0 :(得分:1)
虽然C的字符串支持很差 - 从我看到的样本来看,它有一个独特的模式,从磁盘重新解析它是实用的。
但我会考虑将文件转换为数据库并从那里开始工作。除非有理由不这样做,否则请引入第三方数据库引擎。
如果您决定重新解析文本文件,那看起来并不太难。第一遍将每个列表的起始位置存储为一对。然后你要做的就是寻找索引来读取特定单词的数据。
如果您的效率问题是计算机需要多长时间进行解析,请忘掉它,找出对您来说最简单的方法。在你知道自己需要之前不要优化。计算机快速而廉价,程序员则不然。
答案 1 :(得分:1)
像mattnz指出的那样,最好使用单独的数据库层来实现。你可以尝试SQlite。设置几乎为零,非常稳定。否则,如果要在C中执行此操作,则可以在文件开头添加标题,其中包含指向文件每个部分的链接/索引。部分为&lt; files&gt; ..&lt; / files&gt;,&lt; list&gt; ..&lt; / list&gt;。这只是我的头脑。如果您阅读有关实施数据库的任何书籍,您可以找到更多技术。
答案 2 :(得分:0)
最终,最好的方法(根据我的需要)是保持指向文件中当前位置的指针,并在我到达终点时使用rewind( FILE *f );
。