我有一个很大的英语单词词典(大约70k),我在程序开头加载到内存中。它们被加载到基数数据结构中,并且每个trie节点通常具有从一个节点到许多其他节点的许多链接(例如,词语反义词,“死” - >“活着”,“好”)。每个节点中还有一个std::vector<MetaData>
,其中包含我的程序的各种其他元数据。
现在,问题在于此文件的加载时间。从磁盘读取文件,反序列化并为事物分配数据结构通常需要很长时间(4-5秒)。
目前,我正在努力异步(或逐位,每帧的一小部分)加载,但由于应用程序的性质(它是一个移动键盘),有很多次它在哪里只需要快速加载。
如何加快加载速度?内存池一切?我正在对不同的部分进行基准测试以查看可以优化的内容,但看起来,到目前为止,这只是一些小问题。
答案 0 :(得分:3)
如果trie是静态的(即程序运行时不会改变),则使用数组索引代替指针在数组中构建优化版本。然后,您可以将其保存为数据文件。然后启动只是将该数据块加载到内存中。
这样做会使一些事情变得不那么方便(例如,你必须使用数组而不是std::vector
),你可能需要做一些演员,但是有点想到你结束了具有非常紧凑和非常快速的数据结构,不会受到与为每个节点创建对象相关的分配开销的影响。相反,它本质上是一个不同长度结构的数组。
我为使用有向无环字图(DAWG)的应用程序执行了此操作。我没有在每次加载程序时重建DAWG(这是一个耗时的过程),而是有一个实用程序来创建DAWG并将其作为数据文件提供,而不是单词列表。
答案 1 :(得分:1)
不知道细节,只是一个模糊的想法:
加载批量数据(条目)将为您提供基本字典。
对于所有交叉引用(如同义词和反义词等),在您显示&#34; ready&#34;之后,在后台加载和处理数据。机会是,直到A.用户在第一个查询中输入,你就是船形。
<强>后来强>
如果文件相当大,读取压缩版本可能会获得。
此外,缓冲区大小适当增加的BufferedReader可能有所帮助。
答案 2 :(得分:1)
您应该检查数据结构,以便加快数据加载速度 此外,拆分成多个表可能会加快速度。
例如,有一个用于单词的表,另一个用于同义词的表和用于其他关系的附加表。
第一个表应该有组织。这允许同义词表表示为;哪个应该快速加载。
然后,您可以根据加载的数据构建任何内部容器。存储数据与内部数据具有不同数据结构的原因是为了优化。用于数据存储(和加载)的结构针对加载进行了优化。内部数据的结构针对搜索进行了优化。
答案 3 :(得分:0)
另一个想法是基于它是一个移动键盘应用程序的事实。 有些单词的使用频率高于其他单词,所以也许你可以组织它,这样就可以先加载常用的单词,然后根据需要(或者你有时间)加载不经常使用的单词。