加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用公共部分压缩字符串

发布时间:2020-12-16 06:57:40 所属栏目:百科 来源:网络整理
导读:我有一个管理大量字符串的应用程序.字符串采用类似路径的格式,并且有许多共同的部分,但没有明确的规则.它们不是文件系统上的路径,但可以这样考虑. 我显然需要优化内存消耗,但不会造成很大的性能损失. 我正在考虑两种选择: – 实现一个压缩存储数据的compres
我有一个管理大量字符串的应用程序.字符串采用类似路径的格式,并且有许多共同的部分,但没有明确的规则.它们不是文件系统上的路径,但可以这样考虑.
我显然需要优化内存消耗,但不会造成很大的性能损失.

我正在考虑两种选择:
– 实现一个压缩存储数据的compressed_string类,但我需要一个固定的字典,我现在无法找到一个库.我不希望霍夫曼在字节上,我希望它在单词上.
– 在字符串部分上实现某种flyweight模式.

这个问题看起来很常见,我想知道什么是最好的解决方案,或者有人知道一个针对这个问题的库.

谢谢

解决方法

Strings are in a path-like format and have many common parts,but without a clear rule.

从某种意义上说,它们是表单名称的层次结构中的定位符,(分隔符,名称)*?如果是这样,您可以使用interning:将名称部分存储为指向字符串池的char const *元素.这样,您可以有效地压缩使用n次的名称,使其超过n * sizeof(char const *)strlen(name)字节.完整路径将成为一系列实习名称,例如一个std :: vector.

看起来sizeof(char const *)在64位硬件上很大,但你也节省了一些分配开销.或者,如果您因某种原因知道您将永远不需要超过65536个字符串,则可以将它们存储为

class interned_name
{
    uint16_t tab_idx;

  public:
    char const *c_str() const
    {
        return NAME_TABLE[tab_idx];
    }
};

其中NAME_TABLE是静态std :: unordered_map< uint16_t,char const *>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读