5

次のタスクに適したテクノロジを推奨してください。

基本的に数値の行列であるかなり大きな (500MB) データ チャンクがあります。データのエントロピーは低く (十分に圧縮可能である必要があります)、ストレージは場所によっては高価です。

私が探しているのは、非常にまれなランダム アクセスを可能にするマーカーを使用して、適切な圧縮アルゴリズム (GZip など) で圧縮することです。「元の (圧縮されていない) ストリームの場所 [64 ビット アドレス] からバイトを読み取る」のようなランダム アクセス。これは、ストリームを継続的に解凍できる ZLIB などの従来のデフレーター ライブラリとは少し異なります。私が望むのは、たとえば、読み取りバイトあたり 1MB もの圧縮解除作業のレイテンシでランダム アクセスを行うことです。

もちろん、NIH の車輪を再発明するのではなく、既存のライブラリを使用したいと考えています。

4

8 に答える 8

2

Java で作業している場合は、そのためのライブラリを公開しました: http://code.google.com/p/jzran

于 2010-11-07T06:46:45.420 に答える
1

バイト ペア エンコーディングにより、データへのランダム アクセスが可能になります。

それを使用しても圧縮率は高くなりませんが、1 つのツリーのために適応型 (可変) ハッシュ ツリーを犠牲にしているので、それにアクセスできます。

ただし、特定の「バイト」を見つけるには、何らかのインデックスが必要です。1 MB のレイテンシーは問題ないので、1 MB ごとにインデックスを作成します。インデックスを十分に小さくして、圧縮の恩恵を受ける方法を見つけていただければ幸いです。

この方法の利点の 1 つは、ランダム アクセス編集でもあります。比較的小さなチャンクでデータを更新、削除、および挿入できます。

めったにアクセスされない場合は、インデックスを gzip で圧縮し、必要に応じてデコードできます。

于 2010-07-01T16:18:49.247 に答える
1

関連する作業を最小限に抑えたい場合は、データを 1 MB (または任意のサイズ) のチャンクに分割し、その断片を PKZIP アーカイブに入れます。次に、ファイル オフセットを取得し、解凍する適切なファイルを取得するために 1M で除算するための小さなフロントエンド コードが必要になります (そして、明らかに、残りを使用してそのファイルの適切なオフセットを取得します)。

編集:はい、これを処理する既存のコードがあります。Info-zip の unzip の最近のバージョン (現在は 6.0) には、api.c. これにはとりわけUzpUnzipToMemory、ZIP ファイルの名前と、取得するアーカイブ内のファイルの 1 つの名前を渡します。次に、そのファイルの内容を保持するバッファーを取得します。更新するには、and を使用して zip3.0 からのファイルが必要です(api.cただし、これらは unzip 側ほど簡単には使用できません)。ZpInitZpArchive

または、バックグラウンドで zip/unzip のコピーを実行して作業を行うこともできます。これはそれほどきれいではありませんが、間違いなく実装が少し簡単です (また、必要に応じてフォーマットを簡単に切り替えることができます)。

于 2010-07-01T16:28:40.780 に答える
0

圧縮アルゴリズムは通常ブロックで機能するので、ブロックサイズに基づいて何かを思い付くことができるかもしれません。

于 2010-07-01T16:13:57.647 に答える
0

BoostIostreamsライブラリの使用をお勧めします。Boost.Iostreamsは、TCP接続にアクセスするためのストリームを作成するため、または暗号化とデータ圧縮のフレームワークとして使用できます。ライブラリには、メモリマップトファイルへのアクセス、オペレーティングシステムのファイル記述子を使用したファイルアクセス、コード変換、正規表現によるテキストフィルタリング、行末変換、zlib、gzip、bzip2形式での圧縮と解凍のためのコンポーネントが含まれています。

BoostライブラリはTR2の一部としてC++標準委員会に受け入れられたため、最終的にはほとんどのコンパイラに組み込まれる予定です(under std::tr2::sys)。また、クロスプラットフォーム互換です。

ブーストリリース

Boostスタートガイド注:の一部のみboost::iostreamsがヘッダーのみのライブラリであり、リンク時に個別にコンパイルされたライブラリバイナリや特別な処理は必要ありません。

于 2010-07-01T16:14:40.610 に答える
0

bzip2を使用して、JamesTaylorのseek-bzip2に基づいて独自のAPIを非常に簡単に作成できます。

于 2010-12-17T01:18:10.263 に答える
0
  1. 最初に大きなファイルを並べ替える
  2. 名前にいくつかのシーケンス(File_01、File_02、..、File_NN)を付けて、希望のサイズ(1MB)のチャンクに分割します
  3. 各チャンクから最初の ID とファイル名を取得し、両方のデータを別のファイルに入れます
  4. チャンクを圧縮する
  5. 必要に応じてバイナリ検索などの方法で ID のファイルを検索し、各ファイルを開くことができます。

深いインデックス作成が必要な場合は、「ページ」がファイルである BTree アルゴリズムを使用できます。Web では、コードが少しトリッキーであるため、これのいくつかの実装が存在します。

于 2010-07-01T16:47:36.210 に答える