加载到内存的文件的大小远大于其磁盘大小?!!任何压缩方式
File loaded to memory has much larger size than its disk size?!! Any way to compress?
我现在有一个棘手的问题。我有一个大字典文件要加载到我的程序中,它的格式基本上是:
word1 val1
word2 val2
word3 val3
...
...
此文件有170k行,磁盘上的大小为3.9MB(纯文本)。在我的实现中,我使用boost::unordered_map(哈希表)来存储这些数据,以支持程序中的只读查找操作。
然而,在运行时加载到内存后,由于加载操作,内存使用量增加了20MB(我通过windows任务管理器中的专用工作集大小检查了这一点,也许这不是确定内存使用量的正确方法?)。我知道哈希表中一定有一些辅助数据结构来存储会增加内存使用量的数据,但我没想到内存大小是磁盘大小的5倍!
这正常吗由于我在std扩展库中尝试了另一个版本的hashmap,在其他一些内存中尝试了Trie结构,所以它们都没有在这个问题上带来显著的改进。
所以我想对这个问题进行一些空间优化。有人能给我一些提示或关键词来指导我提高空间使用率吗?
哈希映射数据结构分配的内存比一次使用的内存多得多。这是为了便于快速插入和移除。当哈希表达到一定容量时(定义了实现,但它是一个数字,如50%已满、70%已满、90%已满等),它将重新分配更多内存并复制所有内容。关键是它分配的内存比正在使用的内存多。
此外,您看到程序使用的20MB是程序正在使用的所有内存的大小,而不仅仅是一个哈希图。
此外,如果使用std::string
或等效结构来存储值,则已经创建了从文件中获得的一半数据的副本。您将在读取文件的缓冲区中有一个副本,然后在哈希表的string
中有另一个副本。
如果字符串的最大大小相当小,可以将它们存储在一个大字符数组中,并使用二进制搜索进行查找(当然是在对它们进行排序之后)。
相关文章:
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- 是否有任何优雅的方式来遍历元素位置可以更改的列表?
- 以编程方式在任何按钮上突出显示 Qt 鼠标悬停按钮
- 任何人都有任何想法编写与C 旧手机中的消息作曲家以相同方式工作的程序
- 在任何方式上,所有捕获量都与完全没有试用块块有所不同
- C 以任何方式将类定义放置在main()函数之后
- C#中的C++样式模板,可以用任何方式
- 以任何方式同时运行2个循环
- 是否可以以任何方式在类中提供内联流运算符(即非友元)
- 是否有可能以任何方式(使用C++预处理器等)将shared_ptr替换为<T> T$,weak_ptr<T>替换为 T%,unique_ptr<T>替换为 T?
- 任何方式来取消信号传播在升压信号s2没有例外
- 以任何方式将基指针强制转换为派生指针是否危险
- 不能以任何方式读取函子类
- 为CvMat.data联合创建C#结构,或以任何方式在C#中访问它
- 以任何方式多次打开共享内存都很糟糕
- 在使用工厂模式时,我应该避免以任何方式进行下转换吗
- 尝试以任何方式删除所有编译器警告是最佳做法
- 向线程中的函数传递参数的任何方式
- 我可以将数据分配给从OpenCV对象解引用中检索的双函数返回以任何方式