加载到内存的文件比磁盘大小大得多?!!有什么方法可以压缩?

时间:2012-02-24 19:48:31

标签: c++ memory hashtable

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

word1 val1
word2 val2
word3 val3
...
...

此文件在磁盘上有170k行,其大小为 3.9MB (纯文本格式)。在我的实现中,我使用boost :: unordered_map(hashtable)来存储这些数据,以支持程序中的只读查找操作。

然而,在运行时加载到内存后,由于加载操作,内存使用量增加了 20MB (我通过Windows任务中的私有工作集大小进行了检查经理,也许这不是确定内存使用情况的正确方法?)。我知道哈希表中必须有一些辅助数据结构来存储会增加内存使用量的数据,但我没想到内存大小比磁盘大小多5倍!< / p>

这是正常的吗?由于我在std扩展库中尝试了另一个版本的hashmap,而在其他一些内存中尝试了Trie结构,因此没有一个版本在这个问题上带来显着的改进。

所以我想在这个问题上实现一些空间优化。任何人都可以提供一些提示或关键字来指导我改善空间使用吗?

2 个答案:

答案 0 :(得分:1)

哈希映射数据结构分配的内存比一次使用的内存多得多。这是为了便于快速插入和移除。当哈希表达到某个容量(实现已定义,但它是50%已满,70%已满,90%已满等)时,它将重新分配更多内存并复制所有内容。关键是它分配的内存多于使用中的内存。

此外,您看到程序使用的20 MB是程序正在使用的所有内存的大小,而不仅仅是一个哈希映射。

此外,如果您使用std::string或等效结构来存储值,则您已经创建了从文件中获取的一半数据的副本。您在读取文件的缓冲区中有一个副本,然后在哈希表的string中有另一个副本。

答案 1 :(得分:0)

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