【问题标题】:Efficient random access within a file? [C]文件内的有效随机访问? [C]
【发布时间】:2011-05-05 02:44:20
【问题描述】:

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

<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 和 rewinding 做一些事情。

谢谢,
迈克

【问题讨论】:

  • 因为这个文本文件看起来不是很有条理,我无法想象这会是有趣。你能做一些激烈的事情,比如切换到SQLite3 来存储所有数据吗?您可以将输入文件读入 SQLite 数据库,完成您的工作,然后再次以您自己的格式编写输出文件。 (如果它必须互操作。)让其他人处理高速访问。 :) (或者:用固定长度的记录编写你自己的 binary 格式。请参阅fread(3)。糟糕的损坏处理,但出色的随机访问。)
  • 不幸的是,这不是为了好玩。是上课用的现在还有谁为了好玩而用 C 语言编程?
  • 我愿意。您是否尝试过查看 mmap(或 Windows 等效项)?

标签: c caching file-io fseek


【解决方案1】:

尽管 C 对字符串的支持很差 - 从我可以看出的示例来看,它有一个独特的模式,从磁盘重新解析它是可行的。

不过,我会考虑将文件转换为数据库并从那里开始工作。除非有理由不这样做,否则请引入第三方数据库引擎。

如果你决定去重新解析文本文件,它看起来并不太难。首先将每个列表的起始位置存储为一对。然后你所做的就是寻找索引来读取特定单词的数据。

如果您关心的效率问题是计算机进行解析需要多长时间,请忘记它,找出对您来说最容易的方法。在你知道你需要之前不要优化。计算机既快速又便宜,而程序员则不然。

【讨论】:

    【解决方案2】:

    就像 mattnz 指出的那样,这最好使用单独的数据库层来实现。你可以试试 SQlite。几乎为零设置并且非常稳定。否则,如果您想在 C 中执行此操作,您可以在文件开头有一个标题,其中包含指向文件每个部分的链接/索引。部分为 ....。这只是在我的头上。如果你读过任何关于实现数据库的书,你会发现更多的技术。

    【讨论】:

      【解决方案3】:

      最终发现(满足我的需要)最好的方法是在文件中保留一个指向当前位置的指针,并在我到达末尾时使用rewind( FILE *f );

      【讨论】:

        猜你喜欢
        • 2015-01-10
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多