用公共部件压缩字符串
Compressing strings with common parts
我有一个管理大量字符串的应用程序。字符串采用类似路径的格式,有许多公共部分,但没有明确的规则。它们不是文件系统上的路径,但可以认为是这样。我显然需要优化内存消耗,但不会牺牲太大的性能。
我正在考虑两个选项:
-实现了一个compressed_string
类,它存储压缩后的数据,但我需要一个固定的字典,而且我现在找不到它的库。我不想在字节上使用霍夫曼,我想在单词上使用它
-在字符串部件上实现某种CCD_ 2模式。
这个问题看起来很常见,我想知道什么是最好的解决方案,或者是否有人知道针对这个问题的库。
感谢
尽管为您的问题调整特定的算法可能很诱人,但它可能需要不合理的时间和精力,而标准压缩技术将立即为您解决内存消耗问题提供巨大的帮助。
处理这个问题的"标准"方法是将源数据分块成小块(如256KB(,并对其进行单独压缩。将数据访问到块中时,需要首先对其进行解码。因此,最佳块大小实际上取决于您的应用程序,即应用程序流越多,块就越大;另一方面,随机接入模式越多,块大小就越小。
如果您担心压缩/解压缩速度,请使用高速算法。如果解压缩速度是最重要的指标(对于访问时间(,那么像LZ4这样的东西将为您提供大约1GB/s的解码性能每个内核,因此这可以让您了解每秒可以解码多少块。
如果只是减压速度很重要,你可以使用高压缩变体LZ4-HC,它将使压缩比提高约30%,同时也提高了减压速度。
字符串采用类似路径的格式,有许多公共部分,但没有明确的规则。
从某种意义上说,它们是形式为名称、(分隔符和姓名(*的层次结构中的定位器?如果是这样,您可以使用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];
}
};
其中CCD_ 7是CCD_。
- 连接和压缩标准::vector<std::字符串的最佳方法>
- 从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在Mac os上打开Windows txt文件)
- 解压缩附加的压缩字符串
- 如何使用 Zstd 压缩C++字符串?
- 用Zlib解压缩文本字符串
- 可逆字符串压缩 PHP/C++
- 将参数包解压缩到字符串视图中
- 如何在C 中压缩字符串
- 使用 qCompress 使用 GZip 压缩字符串
- C++位操作:如何将char解码/解压缩为int,并显示正确的字符串
- 7zip 字符串/流压缩 PHP/C?存档中没有文件名/日期存储.7z每个字节都很重要
- 使用重复字符压缩字符串
- C++字符串压缩
- 简单的 zlib C++字符串压缩和解压缩
- 整数字符串压缩算法
- 在位压缩字符串(C++)
- C++和zlib,有助于压缩字符串
- 将固定长度的短字符串(52个字符)压缩到小于40个
- 字符串压缩(面试准备)
- 字符串压缩 (C++)