c++ - 从文件中快速加载大型数据结构

标签 c++ algorithm serialization data-structures trie

我有一个很大的英语单词词典(大约 70k),我在程序开始时将其加载到内存中。它们被加载到基数树数据结构中,每个树节点通常有从一个节点到许多其他节点的许多链接(例如单词反义词,“死”->“活”,“好”)。每个节点也有一个 std::vector<MetaData>其中包含我的程序的各种杂项元数据。

现在,问题出在这个文件的加载时间上。从磁盘读取文件、反序列化和为事物分配数据结构通常需要很长时间(4-5 秒)。

目前,我正在努力使负载异步(或一点一点,每帧一小部分),但由于应用程序的性质(它是移动键盘),很多时候它只需快速加载即可。

可以做些什么来加快加载速度?内存池一切?我正在对不同的部分进行基准测试以查看可以优化哪些部分,但到目前为止,它看起来只是一些小事。

最佳答案

如果 trie 是静态的(即在程序运行时不会改变),则使用数组索引代替指针在数组中构建优化版本。然后您可以将其保存为您的数据文件。然后启动相当于将该数据 block 加载到内存中。

这样做会使某些事情变得不那么方便(例如,您必须使用数组而不是 std::vector),并且您可能需要进行一些转换,但是稍微考虑一下,您最终会得到一个非常紧凑且非常快速的数据结构,该结构不会受到与为每个节点创建对象相关的分配开销的影响。相反,它本质上是一个不同长度结构的数组。

我为使用有向无环字图 (DAWG) 的应用程序执行此操作。我没有在每次加载程序时都重建 DAWG(一个耗时的过程),而是使用一个实用程序来创建 DAWG 并将其作为数据文件发送,以代替单词列表。

关于c++ - 从文件中快速加载大型数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24313762/

相关文章:

c# - protobuf-net 隐式合约

c++ - 具有启用/禁用功能的匿名结构

c++ - 2-3-4 泄漏的析构函数

c++ - 在 C++ 中拥有大 float

java - 如何检查两个矩阵是否有相同的行?

java - Java 中的最大 SHA-1 哈希性能技巧

c++ - 无法使用 Fedora 中的 g++

java - 是否有一个好的算法来检查指定时间段内数据的变化?

.net - 访问串行端口需要哪些 ASP.NET 权限?

javascript - jQuery 不序列化文本输入,尽管它已被填充