C# 将trie保存到磁盘

C# 将trie保存到磁盘,c#,performance,data-structures,persistence,trie,C#,Performance,Data Structures,Persistence,Trie,这听起来是个简单的问题,但我不知道如何寻找答案 我有一个C#中的trie实现,它将存储一个字典文件中的大约80K个单词。加载所有这些单词需要相当长的时间(超过5分钟)。我想知道,“持久化”这些数据的最佳方式是什么,这样我就不必每次启动应用程序时都重新加载所有单词了 谢谢 与所有其他性能问题一样,理想的解决方案是分析您当前的解决方案和您提出的其他候选解决方案。瓶颈在哪里?I/O?对文本进行词法分析?在trie中形成链接?如果不了解您的性能目标、trie使用的性质和当前存在的瓶颈,就很难提出具体的建

这听起来是个简单的问题,但我不知道如何寻找答案

我有一个C#中的trie实现,它将存储一个字典文件中的大约80K个单词。加载所有这些单词需要相当长的时间(超过5分钟)。我想知道,“持久化”这些数据的最佳方式是什么,这样我就不必每次启动应用程序时都重新加载所有单词了


谢谢

与所有其他性能问题一样,理想的解决方案是分析您当前的解决方案和您提出的其他候选解决方案。瓶颈在哪里?I/O?对文本进行词法分析?在trie中形成链接?如果不了解您的性能目标、trie使用的性质和当前存在的瓶颈,就很难提出具体的建议

要审议的问题:

  • 存储格式:文本?二进制
  • 持久化数据:trie的整个结构(如XML)或只是一个单词列表,依靠运行时代码将它们推送到数据结构中的正确位置?标记与数据的比率是多少?解析有多重
  • 存储位置:DB/平面文件/
  • 增量加载:可能吗
  • 一个可能的策略是:创建并保存一个包含1000个(或更多)最常用单词的“最常用单词”词典。在启动时将这些单词加载到trie中,并在另一个线程上生成完整字典的加载;在读取新词时,以增量方式添加到创建的trie中

    • 优点:用户将看到更快的启动时间
    • 缺点:可能需要交叉线程 同步,用户将看到 直到加载完成,才完成trie 完全完成。根据trie的用途,这可能是也可能不是一个showstopper

    与所有其他性能问题一样,理想的解决方案是分析您当前的解决方案和您提出的其他候选解决方案。瓶颈在哪里?I/O?对文本进行词法分析?在trie中形成链接?如果不了解您的性能目标、trie使用的性质和当前存在的瓶颈,就很难提出具体的建议

    要审议的问题:

  • 存储格式:文本?二进制
  • 持久化数据:trie的整个结构(如XML)或只是一个单词列表,依靠运行时代码将它们推送到数据结构中的正确位置?标记与数据的比率是多少?解析有多重
  • 存储位置:DB/平面文件/
  • 增量加载:可能吗
  • 一个可能的策略是:创建并保存一个包含1000个(或更多)最常用单词的“最常用单词”词典。在启动时将这些单词加载到trie中,并在另一个线程上生成完整字典的加载;在读取新词时,以增量方式添加到创建的trie中

    • 优点:用户将看到更快的启动时间
    • 缺点:可能需要交叉线程 同步,用户将看到 直到加载完成,才完成trie 完全完成。根据trie的用途,这可能是也可能不是一个showstopper

    我最近重构了一个类似的数据结构,原因是性能低下,序列化/反序列化时间缓慢

    我的解决方案是完全放弃trie,使用本机.NET集合—字典和查找

    我正在处理大约40万个单词。从内存中构建数据结构大约需要5秒钟,数据结构是由大量字典和查找索引的对象列表

    • 结构的顶层是一个
      字典
      键在哪里 是n-表中的字母数 搜索词
    • 中的每个值 字典是一种
      查找
      ,其中键是字符串 有n个字母,值为 以该字符串开头的字符串。 e、 键“st”值的g可能是 “开始”、“停止”和“字符串”
    要创建数据结构,我只需遍历I=1到maxlength的整个单词列表,就可以为每个I创建所有不同的“start with”字符串的查找。把它们插入顶级字典,你就完成了


    这样就不需要定制trie。我发现性能差异(搜索时间)是可以忽略的,但加载速度大大有利于我的设计(更不用说使用简单的.NET类型的简单性和可维护性)。

    由于性能和序列化/反序列化时间缓慢,我最近重构了一个类似的数据结构

    我的解决方案是完全放弃trie,使用本机.NET集合—字典和查找

    我正在处理大约40万个单词。从内存中构建数据结构大约需要5秒钟,数据结构是由大量字典和查找索引的对象列表

    • 结构的顶层是一个
      字典
      键在哪里 是n-表中的字母数 搜索词
    • 中的每个值 字典是一种
      查找
      ,其中键是字符串 有n个字母,值为 以该字符串开头的字符串。 e、 键“st”值的g可能是 “开始”、“停止”和“字符串”
    要创建数据结构,我只需遍历I=1到maxlength的整个单词列表,就可以为每个I创建所有不同的“start with”字符串的查找。把它们插入顶级字典,你就完成了


    这样就不需要定制trie。我发现性能差异(搜索时间)是可以忽略的,但加载速度极大地有利于我的设计(更不用说使用简单的.NET类型的简单性和可维护性)。

    我只想用旧的MFC二进制方式序列化它。基本上,读/写应该尽可能快,剩下的就是在输入时分配和初始化结构,这是无论如何都需要做的

    也就是说
    Read/Write number N of subnodes
    For each subnode
      If reading, allocate a subnode in this node
      Read/Write the character for the subnode
      Serialize the subnode
    End