【问题标题】:How to roll my own index in c#?如何在 C# 中滚动我自己的索引?
【发布时间】:2010-06-03 12:25:23
【问题描述】:

我需要一种更快的方法来创建索引文件。应用程序生成要索引的项目对。我目前将生成的每一对添加到排序字典中,然后将其写入磁盘文件。这在添加的项目数量超过一百万之前效果很好,此时它会减慢到不可接受的程度。可以有多达 300 万个数据项要编入索引。我更喜欢避免使用数据库,因为我不想显着增加部署包的大小,现在它不到一兆字节的二分之一。我尝试了 Access,但它比排序字典还要慢 - 如果它有一个高效的批量加载实用程序,那么它可能会起作用,但我没有找到这样的 Access 工具。

有没有更好的方法来滚动我自己的索引?

【问题讨论】:

  • 你做过分析吗?您至少应该检查修改内存中的 SortedDictionary 或将其写出所花费的时间。检查您的内存使用情况也是值得的;你没有说你的项目有多大,但你可能只是用完了物理 RAM 并进入交换。

标签: c# indexing


【解决方案1】:

SortedDictionary 真的是瓶颈吗?与 I/O 相比?
您确实应该首先对此进行分析,以防止优化错误的部分。

但作为提示,当您有 1M 或更多项目时,最好预先分配您的字典。给它2M左右的初始容量。

//var index = new SortedDictionary(2 * 1024 * 1024);  // not supported, it's a tree
var index = new SortedList(2 * 1024 * 1024);

如果您的字典是问题所在,我希望它来自不断重新分配,而不是来自实际的索引搜索。

【讨论】:

  • 我会试试的。在加载 SD 之前没有 IO,然后将整个 SD 写出。
  • SortedDictionary 似乎没有像其他一些结构那样允许初始大小分配的构造函数。有没有其他方法可以预先分配它的大小?
  • @bill,你说得对,SortedDictionary 不支持。 SortedList 可以,您可以尝试使用它作为替代品。尽管乍一看它的插入行为更差。
【解决方案2】:

只是一个想法,但是您可以使用内存中的 SQL 解决方案,例如 SQL Lite 吗? 它只是一个小 DLL,但可以帮助您确定优先级,在 C# 中执行逻辑并在 SQL 中进行排序。

看看这里:

http://web.archive.org/web/20100208133236/http://www.mikeduncan.com/sqlite-on-dotnet-in-3-mins/

SQL Lite 本身的下载量仅为 253k,.net 绑定约为 75k。

【讨论】:

  • sqlite.org 似乎已经休息了一天 - 没有网站。我用谷歌搜索了它,但链接无处可去。那么它是一个开源项目吗?
  • 嗨,Bill,抱歉回复晚了,SQL Lite 网站似乎又回来了,SqlLite ADO.Net 提供程序在 sourceforge 上。
【解决方案3】:

SQLite 是否太大而无法与您的软件一起部署?我同意 Henk 的观点,即 SortedDictionary 中不断的重新分配可能是瓶颈。如果该解决方案被证明是错误的,请尝试使用 SQLite 看看这是否会提高性能,然后您可以决定从那里去哪里。

【讨论】:

  • SqlLite + dot.net 绑定解压缩后大约 350kb。如果删除 C# 不需要的部分,可能会小很多。
猜你喜欢
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多