【发布时间】:2011-02-28 20:30:41
【问题描述】:
我有一个大约 100,000 行 (5 MB) 的文本文件,每天更新一次。它以每天大约 30 条线的速度增长。这些行没有以任何方式排序。每行 50 个十六进制字符长,如下所示:
ABCDE9DAF1F66C10C02F25A1685821F8428422F5870F39A3FE
给定这些字符串之一,我需要确定它是否存在于该文件中。我正在手持设备上使用 C# (.NET CF 2.0),因此内存有限。我有能力在 Windows 服务器上事先处理文件。最快的方法是什么?我最初的一些想法包括:对文件进行排序、逐行比较字符串、创建要搜索的二进制文件或使用 SQLite。
来自 OP 的 cmets(一个重要的问题,最初被排除在问题之外):
该文件是只读的。不会有任何改变 永远由我的程序制作。我得到一个 每天都有新版本的文件 更多的字符串追加到末尾
【问题讨论】:
-
您可以通过将字符串视为整数来将文件大小减半。既然您正在寻找“最佳”,那么字符串是否有任何分布?例如,以“A”开头的字符串是否比以“E”开头的字符串出现的频率更高……
-
字符串长度为 100 位,如何将它们视为整数?我不知道将来可以将哪些字符串添加到文件中,所以我不想设计一种聪明的搜索技术,它依赖于未来几个月可能发生变化的某个分布。
-
ABCD 将 4 个字节作为字符串,但将 2 个字节作为整数,但您似乎已经以这种方式存储它们,因为您谈论的是 100 位,而不是 200 位。
标签: c# .net algorithm performance string