問題タブ [bzip2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python bz2file は bz2 より遅いですか?
正規表現を使用して BZ2 圧縮ログファイルを解析する Python スクリプトがあります。
最初は正規表現だと思っていたパフォーマンスがかなり低下していましたが、さらに調べてみると、bz2file のパフォーマンスが低下しているようです。
Python 2.6 と bz2file 0.9 を使用しています。
Bz2file (http://pypi.python.org/pypi/bz2file) を使用してファイルを順次読み取ると、組み込みの bz2 実装を使用する場合よりも大幅に遅くなることに気付きました。
2 つのテスト スクリプトを作成しました。1 つは bz2 を使用しています。
もう1つはbz2fileを使用しています:
私はそれらの両方を計ります:
比較のために、同じファイルの bzcat:
私の理解では、bz2file は単なる bz2 のラッパーでしたが、複数ストリームの BZ2 ファイル (これを使用しています) の処理が追加されています。
bz2file が bz2 よりもはるかに遅い理由は他にありますか? (または、上記の私の分析に欠陥がありますか?) もしそうなら、bz2file を高速化する方法はありますか?
乾杯、ビクター
編集-Python 3.3を含め、さらにいくつかのテストを行いました-明らかにbz2fileはPython 3.3のbz2モジュールのバックポートです-また、jordanmが示唆するようにキャッシュをフラッシュします(ルートとして、実行ごとに別のターミナルでこれを行いました):
これが私の方法論なのか、Python 2.x の bz2 と Python 3.x の bz2 の間に実際のパフォーマンスの低下があるのかはわかりません。
python - メモリマップされた bzip2 圧縮ファイルの読み込み
だから私はウィキペディアのダンプファイルで遊んでいます。bzip された XML ファイルです。すべてのファイルをディレクトリに書き込むことはできますが、分析を行う場合は、ディスク上のすべてのファイルを再度読み取る必要があります。これによりランダムアクセスが可能になりますが、遅いです。bzip されたファイル全体を RAM に入れるための RAM があります。
ダンプファイルを問題なくロードしてすべての行を読み取ることができますが、巨大なのでシークできません。どうやら、bz2 ライブラリは、そこに移動する前にオフセットを読み取ってキャプチャする必要があります (オフセットは解凍されたバイト単位であるため、すべてを解凍します)。
とにかく、ダンプファイル(〜9.5ギガバイト)をmmapしてbzipにロードしようとしています。以前に bzip ファイルでこれをテストしたいのは明らかです。
mmap ファイルを BZ2File にマップしてシークできるようにしたい (圧縮されていない特定のバイト オフセットを取得するため) のですが、mmap ファイル全体を解凍しないと不可能なようです (これは 30 をはるかに超えます)。ギガバイト)。
オプションはありますか?
テスト用に書いたコードを次に示します。
シーク後に行を読み取ることができる bz2 ファイル オブジェクトの特別な点は何ですか? アルゴリズムからチェックサムを取得して正しく機能させるには、その前のすべての行を読み取る必要がありますか?
python - 不足している python bz2 モジュール
ホームディレクトリにインストールしました。
Python 2.7.x バージョンを必要とする 1 つのスクリプトを実行しようとしていますが、bz2 エラーが見つかりません
bz2 モジュールをインストールしようとしましたが、多くのエラーが発生しました
c++ - bzip を使用して iostream をブーストする - 未解決のシンボル
私のプロジェクトは、古いバージョンの Boost の iostreams w/bzip2 を使用していました。現在、Boost 1.51 にアップグレードしようとしています。最初は bzip でコンパイルしなかったので、明らかにリンカが libboost_bzip2-vc100-mt-sgd-1_51.lib が見つからないことを叫んでいました。次に、これらの指示に従って(そして static フラグを追加して)、このファイルをコンパイルしました。
ただし、リンカーを実行すると、不足している一連のシンボルが返されるようになりました。
ライブラリにこのコードがすべて含まれていない理由はありますか? 私は何が欠けていますか?WindowsでVS2010を使用しています。
編集:わかりました!
bzip なしでコンパイルされた libboost_iostreams-vc100-mt-sgd-1_51.lib の古いバージョンがありました。私がまだ確信していないのはこれです:私が使用した元の編集のために:
これにより、次のファイルが作成されました。
「正しい」コンパイル(問題を解決した)には、次を使用しました。
つまり、私にとっては不要だったので、単純に zlib を削除しました。それは生産しました:
元のコンパイルで iostream ライブラリが生成されなかったのはなぜですか? 非常に奇妙な。
ありがとう。
unix - UNIX での bz2 ファイルの比較
私は UNIX サーバー上で多数のデータベースを管理しており、.NET を使用してこれらのデータベースのバックアップを毎日行っていますmysqldump
。これらのデータベース (の一部) は非常に大きい (20+Gb) ため、通常は を使用してバックアップ .sql ファイルをbzip2
圧縮し、圧縮された bz2 ファイルを取得します。
バックアップ プロセスの一環として、新しいバックアップ ファイルのサイズが以前のバックアップ ファイルのサイズ以上であることを確認します。これらのデータベースには毎日データを追加していますが、これらのデータベースからデータを削除することはほとんどありません。データベース。
バックアップ ファイルのサイズのチェックは、バックアップの品質のチェックです。データベースは主にサイズが大きくなるだけなので、新しいバックアップが古いバックアップよりも小さい場合は、次のいずれかを意味します。a) データベースから何かが削除された(その場合、何を確認する必要があります...) または b) バックアップで問題が発生しました (この場合、理由を確認する必要があります...)。
ただし、bz2 ファイルのサイズを比較すると、たとえば の比較 (を使用test
) を使用するとstat %s
、データベースのサイズが大きくなったにもかかわらず、bz2 ファイルが縮小している可能性があります。おそらく、より効率的な圧縮が原因です。
では、バックアップ ファイルのサイズを比較するにはどうすればよいでしょうか。
- 1 つのオプションは、以前のバックアップ ファイルを .bz2 から .sql に解凍し、これらの .sql ファイルのサイズを比較することです。ただし、これらは非常に大きなファイル (20+Gb) であるため、圧縮/解凍には時間がかかる場合があります...
- もう 1 つのオプションは、以前のバックアップ ファイルを .sql として保持し、再度 .sql ファイルの比較を行うことです。これは私の好みのオプションですが、大量の .sql ファイルが横たわって終わらないように注意する必要があります。
または、SO コミュニティの誰かが、より優れた、またはより優れたアイデアを持っている可能性があります...?
c - bzip2 低レベル ルーチンを使用してデータのチャンクを圧縮する
概要
libbzip2
ライブラリ で低レベルの呼び出しを使用しています:BZ2_bzCompressInit()
とBZ2_bzCompress()
、BZ2_bzCompressEnd()
データのチャンクを標準出力に圧縮します。
バイトのストリームが入ってきて、それらのバイトを個別のチャンクのセットに圧縮したいので、高レベルの呼び出しから作業コードを移行しています(個別のチャンクは、対象のトークンのグループを含むバイトのセットです —私の入力は論理的にこれらのチャンクのグループに分割されます)。
チャンクの完全なグループには、たとえば 500 個のチャンクが含まれている可能性があり、これを 1 つの bzip2 ストリームに圧縮して標準出力に書き込みたいと考えています。
セット内で、以下に概説する疑似コードを使用して、サンプル バッファーが一度に 101 個のチャンクを保持できる場合、新しいストリームを開き、101、101、101、101 の実行で 500 個のチャンクを圧縮し、最後に 1 回実行します。ストリームを閉じる 96 個のチャンク。
問題
問題はbz_stream
、ルーチンの 1 回のパスで圧縮されたバイト数を追跡する構造体インスタンスがBZ2_bzCompress()
、最終的な圧縮ファイルの合計バイト数よりも多くの圧縮バイト数を書き込んでいると主張しているように見えることです。
たとえば、圧縮された出力は、実際のサイズが 1234 バイトのファイルである可能性がありますが、報告された圧縮バイト数 (デバッグ中に追跡します) は 1234 バイト (たとえば 2345 バイト) よりも若干多くなります。
私のラフな疑似コードは 2 つの部分に分かれています。
最初の部分は、チャンクのサブセットを圧縮するために私が行うことの大まかなスケッチです (そして、この後に別のサブセットがあることを知っています):
出力をまとめます。
質問
- 計算
cumulativeBytesWritten
(具体的にはbzBytesWritten
) が間違っていますか?どうすれば修正できますか?
デバッグ ビルドでこれらの値を追跡してきましたが、値を「二重にカウント」しているようには見えませんbzBytesWritten
。この値はカウントされ、パスがcumulativeBytesWritten
成功するたびにインクリメントするために 1 回使用されます。BZ2_bzCompress()
bz_stream
または、状態フラグの正しい使用法を理解していませんか?
たとえば、次の例では、いくつかのバイトを送信し続ける限り、圧縮して bzip2 ストリームを開いたままにしますか?
bzStream.next_in
同様に、次のステートメントは、ポインターからアクセスできるバイトが少なくとも数バイトある限り( BZ_RUN
)、データを圧縮できBZ_FINISH
ますか?
- または、これらの低レベルの呼び出しをまったく正しく使用していませんか? 高レベルの呼び出しを使用して、圧縮されたデータのチャンクのグループを 1 つのメイン ファイルに継続的に追加する必要がありますか?
これにはおそらく簡単な解決策がありますが、何が問題なのかをデバッグする過程で数日間頭を悩ませてきましたが、あまり進歩していません. アドバイスありがとうございます。
java - Java復号化コードをGolangに移行します
過去数日間、JavaコードのGolangへの移行に苦労していて、今は行き詰まっています。これは動作するJavaコードです。
Golangでの私の実装:
私がこれまでに知っていること:
- で省略されたすべてのエラー値
_
はnil
、このコードに含まれています - bzip2ヘッダー( "BZ")は、の場合は省略できますが
CBzip2InputStream
、の場合は省略できません。bzip2.NewReader
- Javaとgolangで読み取られた最初の16バイト
instream
は同じで、17バイト目からは、何らかの理由ですべてのバイトが異なります。
linux - 圧縮ファイルに awk を使用する方法
圧縮ファイルの次のコマンドを変更するにはどうすればよいですか?
コマンドは通常のファイルで正常に機能します。圧縮ファイルのコマンドを変更する必要があります。
python - 通常のアーカイブマネージャーでbz2-compressed(Pythonで)ファイルを開くことができません
BZ2Compressorオブジェクトを使用してファイルをbz2-compressするコードを作成しました。
エラーが発生せず、ファイルが作成されますが、アーカイブマネージャーでファイルを開きたい場合、非特定のエラーが発生します。私は自分の間違いを見つけることができず、このモジュールは十分に文書化されていません。