文件中的高效随机访问? [C]

时间:2011-05-05 02:44:21

标签: c caching file-io fseek

我有一个文本文件,用于保存文件和单词(及其频率)的索引。我需要将文件读入内存并存储单词,以便搜索它们。该文件的格式如下:

<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和倒带来做点什么。

谢谢,
麦克

3 个答案:

答案 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 );