在.NET CF中预处理和搜索文本文件的最佳方法

时间:2011-02-28 20:30:42

标签: c# .net algorithm performance string

我有一个大约100,000行(5 MB)的文本文件,每天更新一次。它以每天约30行的速度增长。这些行没有以任何方式排序。每行长度为50个十六进制字符,如下所示:

ABCDE9DAF1F66C10C02F25A1685821F8428422F5870F39A3FE

鉴于其中一个字符串,我需要弄清楚它是否存在于此文件中。我在手持设备上使用C#(.NET CF 2.0),因此内存有限。我有能力在Windows服务器上处理该文件。最快的方法是什么?我的一些初步想法包括:对文件进行排序,逐行比较,创建要搜索的二进制文件,或使用SQLite。

来自OP的评论(一个重要的评论,最初是从问题中遗漏的):

  

该文件是只读的。没有变化   永远都是我的节目制作的。我得到了   每天都有新版本的文件   更多字符串附加到结尾

5 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法可能是对服务器上的文件进行预排序,并使用内存映射文件对文件进行二进制搜索。话虽这么说,.NET CF 2.0将不支持内存映射文件。

您可能最好只对文件进行预排序,并使用流访问对文件执行二进制搜索。它不是很好,因为你没有顺序读取,但看到你在CF上,你的设备上的数据存储很可能是基于闪存的,所以二进制搜索的随机访问可能也不会太多坏...

答案 1 :(得分:1)

保持文件在服务器上排序((c)LorenVS),但是使用记录长度(50个十六进制字符+ 2个Cr Lf)直接对文件进行二进制搜索,以将文件指针(搜索)移动到中间位置和读取字符串进行比较。这应该最小化设备上所需的内存。

好的,我现在看到这个想法的第二部分是(c)LorenVS。

答案 2 :(得分:1)

将数据存储在base-256 DAWG中 - 您将获得相当紧凑的数据表示和快速搜索。

答案 3 :(得分:0)

如果您的应用程序正在运行并且必须阻止将重复的字符串附加到现有文件,则可以将整个文件内容放在哈希表或分类列表的内存中。当您启动应用程序时,您可以在另一个线程中优化此集合的加载,以保持您的UI响应。

考虑到即使使用SQLite或SQL CE,您也拥有嵌入式数据库的足迹,而且我认为5 Mb现在不再吓到任何人了。

答案 4 :(得分:0)

已经有一些对文件进行排序的建议。

另一个想法可能是将主文件保持为未排序的顺序,并使用辅助文件来检查重复项。

具有使用小哈希值和固定数量的偏移值的格式。哈希值是辅助文件中的偏移量。从该偏移量是主文件中的偏移数组。当任何哈希数组填满时,您需要使用更大的哈希值和更大的辅助文件重新计算。或者你可以像cuckoo hash一样使用一些技巧。