加载到内存的文件的大小远大于其磁盘大小?!!任何压缩方式

File loaded to memory has much larger size than its disk size?!! Any way to compress?

本文关键字:任何 方式 压缩 磁盘 内存 文件 加载 大于      更新时间:2023-10-16

我现在有一个棘手的问题。我有一个大字典文件要加载到我的程序中,它的格式基本上是:

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中有另一个副本。

如果字符串的最大大小相当小,可以将它们存储在一个大字符数组中,并使用二进制搜索进行查找(当然是在对它们进行排序之后)。