高容量黑名单包含操作 - C#中的性能

时间:2015-02-11 09:31:35

标签: c# .net performance

我正在处理需要执行网站访问检查的桌面应用程序。我在运行应用程序的PC上有一个巨大的黑名单,面对任务:

如何对这些黑名单进行最快速的检查?

我正在使用C#/。NET开发堆栈,目前我的想法是将所有这些列表加载到hashset并调用Contains方法,但我不确定将它全部加载到内存中是个好主意,也许你可以建议另一种方法,从一方节省内存,并尽可能快地从另一方工作?

这些文件采用纯文本形式,并且在兆字节的范围内,但预计这个大小会增长。

更新: 下载后我找到了网站here的黑名单,并解压缩了大约80兆字节的数据。所以我不确定将所有数据保存在内存中是个好主意。

更新2

  1. 我已经创建了性能测试,下载了2339643的黑名单 项目。
  2. 将其加载到HashSet中并执行1000次迭代检查 速度。
  3. 结果:

    • Contains方法占用的最长时间:0.2 milliseconds(这是第一次通话)
    • 第二次调用约为'0.0164'毫秒 毫秒甚至更少。性能很好。
    • 但是运行测试的应用程序需要 250MB 的系统内存 不如HashSet性能那么好。

1 个答案:

答案 0 :(得分:1)

您可以使用HashSet来存储黑名单,此数据结构允许O(1)分摊时间复杂度以进行插入并检查项目是否存在于集合中。

如果您需要更具伸缩性的内容,可以考虑加入redismemcached

通过评论阅读,我会考虑创建一个执行检查的Web服务。用户可以查询Web服务,如果您不需要在内存中查询,则可以查询redis或memchached或slq服务器。或者,我建议查看白名单,如果你的黑名单增长太多,这可能表明当前方法存在问题。