代码之家  ›  专栏  ›  技术社区  ›  bill seacham

如何在c#中滚动我自己的索引?

  •  1
  • bill seacham  · 技术社区  · 16 年前

    我需要一种更快的方法来创建索引文件。应用程序生成要索引的项对。目前,我将生成的每一对添加到排序字典中,然后将其写入磁盘文件。这项工作很好,直到增加的项目超过100万个,在这一点上它放缓到了不可接受的程度。可以为多达300万个数据项编制索引。我更喜欢避免使用数据库,因为我不想显著增加部署包的大小,它现在不到1兆字节的一半。我试过访问,但它甚至比排序字典慢-如果它有一个有效的大容量加载实用程序,那么可能会工作,但我找不到这样的访问工具。

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

    3 回复  |  直到 16 年前
        1
  •  6
  •   Henk Holterman    14 年前

    SortedDictionary真的是瓶颈吗?与I/O相比?
    你真的应该首先分析这个,以防止优化错误的部分。

    但作为一个提示,当你有100万或更多的条目时,最好预先分配字典。给它2米左右的初始容量。

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

    如果你的字典是个问题,我希望它能比实际的索引搜索更快地从常量重新分配中得到。

        2
  •  1
  •   KyleSolo    14 年前

    只是一个想法,但是你可以使用内存中的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。

        3
  •  0
  •   Josh Smeaton    16 年前

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