在c++中从字典文件创建映射的映射
Creating maps of maps from a dictionary file in c++
我有一个包含单词列表的文本文件(大约35 MB的数据)。我写了一个类似于Scrabble助手的应用程序。我发现将整个文件加载到一个集合中是不够的,因为这样做需要大约10分钟。我对c++不是很有经验,所以我想问你有什么更好的方法来实现它?在我的第一个版本的应用程序中,我只是通过二进制搜索它。因此,我设法通过对文件进行二进制搜索来解决这个问题(不加载它,只是使用seekg移动文件指针)。但是这个解决方案没有使用地图的地图那么快。当搜索一个单词时,我在地图上查找它的第一个字母。然后我检索可能的第二个字母的地图,并进行另一次搜索(查找第二个字母),依此类推。这样我就能更快地知道这个词是否在字典里。如果不将整个文件加载到程序中来制作这些地图,我如何才能实现它?我可以将它们保存在数据库中并读取它们吗?那样会更快吗?
35MB的数据很小。将所有内容加载到内存中没有问题,也没有理由花10分钟来加载。如果花了这么长时间,我怀疑你的加载方案是复制映射。
然而,与其解决这个问题,或者想出你自己的方案,也许你应该尝试一些准备好的东西。
你的描述听起来像是你可以使用嵌套结构的数据库。MongoDB,有一个c++接口,是一个可能的解决方案。
为了提高效率,您可以对方案进行一些花哨的设计。说最多5个字母的单词,你可以使用多键索引。除此之外,您还可以使用完全嵌套的结构。
只是不要自己去做。
首先,我同意Ami的观点,即35mb原则上不应该花那么长时间来加载和存储在内存中。是否加载代码有问题(例如意外复制映射,导致大量的分配/释放)?
如果我理解你的意图,你建立了一种trie结构(trie和not tree)使用映射的映射,如你所描述的。如果在内存中,这可能非常好,但如果您只想在内存中加载部分地图,这将变得非常困难(不是从技术上做到这一点,而是确定加载哪些地图,哪些不加载)。这样就有可能从磁盘读取比实际需要更多的数据,尽管有一些持久化尝试的实现。
如果您打算在磁盘上使用索引方案,我宁愿建议您使用传统的B-tree数据结构,该结构旨在优化部分索引的加载。您可以自己编写,但已经有几个实现(参见这个问题)。
现在你也可以使用像sqlite这样的东西,它是一个轻量级的DMS,你可以很容易地嵌入到你的应用程序中。
- 终端不会为C++文件创建.exe文件吗
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 写入映射文件
- 如何从具有两列的.txt文件创建并行数组?
- 从 .lib 文件创建一个.dll文件
- 如何从输入文件 c++ 创建随机名称生成器
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- 如何为多个目录中的多个文件创建生成文件?
- 在编译时从 c++ 文件创建枚举
- 内存映射文件访问非常慢
- 我正在尝试创建一个C++映射,该映射在boost内存映射文件中具有向量值
- C++ 在映射中创建函数指针向量
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 无法从地址打开映射文件
- 文件创建并不总是成功
- 为什么我无法使用文本文件创建文件映射?
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- C++:创建大内存映射文件会冻结PC
- 如何创建对象文件的映射文件
- 在c++中从字典文件创建映射的映射