私は、メモリ空間トピックについて混乱しています。我々は次の文字列を考えてみましょう:
String from = "Hello I am from Chicago";
私は、ハフマン符号化などLZ4、またはGZipをし、使用してそれをエンコードした場合(符号化アルゴリズムは、この時点では問題ではありません):
String encodedFrom= encodingLibrary.encode(from);
さて、メモリ空間の量がencodedName
開催する、何よりも小さくなりname
かかったでしょうか?
私たちは、文字列を格納する際に、より少ないビットがある場合でも、VM(またはOS自体、または何かが)バイトを完了するために最後にパディングを追加し、ので、私は混乱しています。そんな感じ。だから、一日メモリサイズ(外消費)の終わりに、両方のコード化のための同じで、国連は文字列でエンコード。私は右のそれを考えているだろうか?
最初の1に関連する第二の質問は、私が実際には何千ものレコードのエンコード100SにしたいとRedisのキャッシュに保存します。どのようにプレイアウトを希望、我々はそれが圧縮/伸張とメモリ消費量の要因にかかる時間を除外した場合?エンコードされた文字列は、Redisのキャッシュ内の少ないスペースを取るでしょうか?
任意の助けに感謝。
文字列を圧縮し、その後、別の文字列に圧縮された結果の裏を格納することは非常に悪い考えです。
文字列は、慣例により、文字の配列です。これらは、文字、句読点、空白と同様のものが含まれていることになっています。それは非常に珍しいですので、誰でも発見すると、バイナリデータを格納するためにそれらを使用することをあなたに怒ってます。
あなたは今までに圧縮文字列にしたい場合は、できるだけ正直となると、バイト配列内の圧縮されたデータを格納します。バイト配列は、汎用コンテナであり、その中に任意のデータを記憶することが期待されます。
あなたの主な質問へ戻ります。Javaでは、String
基本的にchar[]
各文字が(これまであなたが平易な英語やから他の文字を扱っているようとして16ビットを消費することをその手段、基本多言語面)。
すべての文字がASCIIであるため、それらのそれぞれは、7ビットを使用してエンコードすることができます。目の前あなたは、単純な圧縮方式とで終わる、「この文字列の残りの部分は、ASCIIのみである」と言ってで別のビットを追加1 + 23 * 7
21バイトになるビット、。確かに、この場合にに比べてそこに最後のバイトでパディングの6ビットがありますが、2 * 23
すでに良いことだという、そのままの文字列を格納するためのバイト。
(私は忘れてしまった:ジャワ9ので、ASCIIのみの文字列が使用する唯一の8文字ごとのビットの代わりに16私が上記提案圧縮方式のみのJava 8まで効率的になるように特別な方法で格納されています)
データストレージ用のRedisを使用する場合は、RAM内のすべてのデータを保持し、それがさらにRAMを割り当てることができない一度クラッシュしていることに注意してください。(私が覚えている限りでは、それは約5年前からです。)ので、あなたがすでに別のデータ・ストレージ・ライブラリを選択し、より良い、数ギガバイトより大きくなるためにRedisのデータを推定することができます。