c# - 快速访问文件中的 key (无需将整个文件加载到内存中)

标签 c# file-io mobile performance hashtable

背景:我正在为 Windows Mobile 编写一个 C# 应用程序,它将从文件系统的字典中搜索定义(科学)。 该文件如下所示(文件有 100K+ 个条目):

 Word1:Meanings(2)
-meaning 1 bla bla bla
-meading 2 bla bla bla
[...]

用户应该能够输入一个词并尽快获得含义。用户只会寻找 1 或 2 个词。为此,我创建了第二个文件,其中包含一个排序列表,其中包含字典文件中的实际单词和字节偏移量。 示例:

word1:12344
word2:32241
word3:298

我查看我的“索引”(简单循环遍历所有行并比较是否相等),然后使用字节偏移量“随机访问”字典文件。 问题是,这仍然很慢。 我尝试将索引加载到数组/列表/哈希表中,但由于 io 速度慢,这需要很长时间(加载索引大约 20 秒)。这很糟糕,因为用户通常只会查找一个词。 因此,我正在寻找某种类型的 n 树实现,它可以直接在文件上工作(无需遍历整个索引)。 有人建议如何执行此操作吗? 我当前的解决方案如下所示(但有缺陷且肮脏): 新索引具有以下格式:

a:FileOffsetInDictionary:FileOffsetOf"ab" //the first 2 character starting with a
b:FileOffsetInDictionary:FileOffsetOf"ba"
c:FileOffsetInDictionary:0 //"0" means that their are no words starting with "c" (just for example)
[...]
ab:FileOffsetInDictionary:FileOffsetOf"aba"
ac:FileOffsetInDictionary:878878 //(just some random values for illustration)
[...]
ba:FileOffsetInDictionary:456
[...]
aba:FileOffsetInDictionary:2342
[...]

搜索是这样完成的:

Users enter the word "Tree"
Look for "t" in index by looping through the index
if "t" found then goto FileOffsetOf2Digit
if "tr" found then goto FileOffsetOf3Digit
[...]
[actually recursively coded]

最佳答案

正确答案可能是告诉您使用 b-tree索引非常适合这种性质的基于磁盘的索引,或者如果您谈论的是移动 6.5 和更早版本,则更好,您可以使用 SQL CE 数据库。您可以找到许多实现,但如果找不到,您可以执行以下操作。

按照您当前的索引文件想法,使每个索引记录具有固定大小。因此,如果您知道单词永远不会超过 50 个字符并且偏移量将适合四字节整数,您可以在索引文件中创建 54 字节的记录条目(假设单词为 ASCII,相应地调整)。然后你可以执行 binary search在索引文件上,而不是扫描整个文件来访问每条记录。

关于c# - 快速访问文件中的 key (无需将整个文件加载到内存中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4947105/

相关文章:

c# - 排序高分的数组

C# 从现有私钥字符串创建 ssh-rsa 公钥

c# - 通过 .NET 发布到 Umbraco 后文章不显示

iPhone 命令行单元测试(和文件 I/O)

jquery - 防止无滚动按钮返回页面顶部

jquery - 禁用 JQuery 移动 UI 中的哈希更改 Controller 并替换为backbone.js

android - 将 phonegap 用于移动视频编辑应用程序

c# - 如何在 Windows 中获取所有等宽字体?

c - C 语言文件 I/O 字数统计程序

python - 以编程方式编辑 Python 源代码