6

私は多くの小さな文字列 (約 75-100 の長さの c# 文字列) を圧縮したいと考えています。辞書が作成された時点で、私はすでにすべての短い文字列 (1 兆近く) を知っています。今後、短い文字列が追加される予定はありません。他の文字列を解凍せずに、正確に 1 つの文字列を追加する必要があります。

今、私はライブラリまたは次のことを行うための最良の方法を探しています:

  1. 私が持っているすべての文字列を使用して辞書を作成します
  2. この辞書を使用して各文字列を圧縮する
  3. 1 から辞書を使用して 1 つの文字列を圧縮する方法。

関連する良い質問が見つかりましたが、これは c# 固有ではありません。たぶん、私が知らないc#の何かがあるか、派手なライブラリまたは誰かがすでにそれを行っています。それが私がこの質問をする理由です。

編集:

http://en.wikipedia.org/wiki/Dictionary_coder しかし、すべてが文字列を短くするのに役立ちます。文字列は、さまざまな言語と URL (30%/70%) の短いテキスト メッセージです。圧縮された文字列が人間が読める必要はありません。バイナリファイルに保存されます。

4

2 に答える 2

2

私はそれを使用していませんが、スマズはこれに有望に思えます...

Smaz は、非常に短い文字列の圧縮に適した単純な圧縮ライブラリです。汎用圧縮ライブラリは、あらゆる種類のデータを圧縮できるようにするために、データを動的に圧縮するために必要な状態を構築します。これは非常に良い考えですが、特定の問題のためではありません: 小さな文字列の圧縮はうまくいきません。

その代わり、Smaz は汎用データの圧縮には適していませんが、平均的なケースでテキストを 40 ~ 50% 圧縮することができ (英語でよりうまく機能します)、HTML と URL に対しても少し圧縮を実行できます。重要な点は、Smaz は 2 バイトまたは 3 バイトの文字列でも圧縮できるということです。

たとえば、文字列「the」は 1 バイトに圧縮されます。

これは C で書かれているので、Bart De Smet の C# を介した C との相互運用の例を確認してください。

于 2012-06-04T22:42:58.717 に答える
2

文字列が 1 兆個以上ない場合、それぞれを 40 ビット (5 バイト) で表すことができます。必要なのは、5 バイトを兆文字列のインデックスとして使用する方法だけです。

兆のすべての文字列をどのように知っていますか? コンプレッサとデコンプレッサの両方が 1 兆個の文字列すべてにアクセスできる場合、または文字列を並べ替えて再作成する方法がある場合、必要なのはインデックスだけです。

文字列にインデックスを付ける方法が見つからない場合は、文字列のサブセットを取得して、コンプレッサーの辞書として使用できます。最も代表的なサンプルを取得し (一部の文字列が他の文字列よりも一般的であったり、他の文字列をより代表的にしている原因を突き止めたりする必要があります)、それらを 32K の辞書に連結します。あなたの1兆の弦の約400本。次に、zlib の圧縮側の deflateSetDictionary と解凍側の inflateSetDictionary の両方が、まったく同じ 32K 辞書を使用します。これにより、短い弦に適切な圧縮が提供されます。

于 2012-06-05T05:07:33.397 に答える