java - 编码字符串会占用更少的内存吗?

标签 java encoding

我对内存空间主题感到困惑。假设我们有以下字符串:

String from = "Hello I am from Chicago";

如果我使用霍夫曼编码、LZ4 或 GZip 等对其进行编码(此时编码算法无关紧要):

String encodedFrom= encodingLibrary.encode(from);

现在,encodedName 所占用的内存空间量会小于 name 所占用的空间量吗?

我很困惑,因为当我们存储字符串时,即使位数较少,VM(或操作系统本身或其他东西)也会在末尾添加填充以完成字节。像那样的东西。所以在一天结束时,编码字符串和编码字符串的内存大小(不是消耗)是相同的。我这样想对吗?

与第一个问题相关的第二个问题,我实际上想对成千上万条记录进行编码并将其存储在 Redis 缓存中。如果我们排除压缩/解压缩和内存消耗因素所需的时间,那将如何发挥作用?编码后的字符串在 Redis 缓存中占用的空间会更少吗?

感谢任何帮助。

最佳答案

压缩一个字符串然后将压缩结果存储回另一个字符串是一个非常糟糕的主意。

按照惯例,字符串是字符序列。它们应该包含字母、标点符号、空格和类似的东西。任何发现您使用它们来存储二进制数据的人都会生您的气,因为这很不寻常。

如果您想压缩字符串,请尽可能诚实并将压缩后的数据存储在字节数组中。字节数组是通用容器,可以在其中存储任意数据。

回到你的主要问题。在 Java 中,String 基本上是一个 char[],这意味着每个字符占用 16 位(就您处理普通英语或 Basic Multilingual Plane 中的其他字符而言) ).

由于所有字符都是 ASCII,因此每个字符都可以使用 7 位进行编码。在最前面添加另一位,说“此字符串的其余部分仅是 ASCII”,您最终得到一个简单的压缩方案和 1 + 23 * 7 位,共计 21 个字节。当然,在这种情况下,最后一个字节中有 6 位填充,但与按原样存储字符串的 2 * 23 字节相比,这已经很好了。

(我只是忘了:从 Java 9 开始,ASCII-only 字符串以一种特殊的方式存储,每个字符只使用 8 位而不是 16 位。所以我上面提出的压缩方案只在 Java 8 之前有效。)

当使用 Redis 进行数据存储时,请记住它会将所有数据保存在 RAM 中,一旦无法分配更多 RAM 就会崩溃。 (据我所知,那是大约 5 年前的事了。)因此,如果您已经可以估计 Redis 数据将超过几 GB,最好选择其他数据存储库。

关于java - 编码字符串会占用更少的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611459/

相关文章:

java - 装饰 Java 的可调用对象以添加行为

Java在列+行的多维数组中打印unicode字符?

java - 为什么直接给按钮添加监听器称为内部类呢?

java - 如何每10秒更新一次GPS位置?

汉字的Python解码问题

encoding - UTF-16与UTF-8兼容吗?

Java:为什么不能迭代迭代器?

python - 通过在 PyCharm 2016.3.2 中运行的 Python 3.6 脚本打开 UTF-8 编码的文件

php - UTF-8 和 ISO-8859-1 : Why does it work for the most of the time and why sometimes not?

php - 在 php 中将文件从 Linux 下载到 Windows 时修复文件编码