250GBの大容量プレーンテキストファイルを作成するための変更できないアプリケーションがあります。 GZで圧縮すると30GBしか残りません。
アプリケーションには出力を圧縮するオプションはなく、ファイル名のみを書き込むことができます(標準出力ではありません)。
まず、250GBファイルをディスクに保存せずに出力の即時圧縮を設定する方法はありますか?
また、アプリケーションが実際に圧縮されたプレーンテキストファイルを読み取るように欺く反対のアプローチも必要です。
答え1
ファイル名としてを使用/dev/stdout
し、アプリケーションの出力をgzip
。
/dev/stdout
へのシンボリックリンクです/proc/self/fd/1
。
同様に、これをファイル名として使用/dev/stdin
し、出力をgzip
アプリケーションにパイプすることができます。
私は言った可能これは、アプリケーションが検索可能であるが/dev/std{in,out}
検索できないファイルを書き込んだり読み取ったりする必要があるためです。このような場合は、迷子になることがあります。検索可能なファイルをアプリケーションのターゲットとして使用する必要があります。
答え2
mkfifo
を使用すると、プログラムが作成され、gzip
最終目的地に到達できる名前付きパイプを設定できます。この(おそらくbash関連の)トリックは、コマンドラインから出力ファイル名をプログラムに渡すことができる場合でも機能します。
program >(gzip - >output.gz)
なぜならこれはシェルによってgzip - </dev/fd/63 >output.gz &; program /dev/fd/63
。
答え3
最初はこれが簡単だと思いました。プログラムが書き込みを期待する圧縮ファイルシステムにループバックデバイスをインストールするだけです。残念ながら、検索中に読み書き可能なファイルシステムが多くなく、そこにあるもの(jffs2)がループバックデバイスを介してマウントできないことがわかりました。
私が見つけたヒューズ圧縮これがあなたが探しているものかもしれませんが、高い信頼性が必要な場合はスキップします。
別のオプションは、ファイルをUSBハードドライブに保存し、プログラムが作成するシンボリックリンクを作成することです。このプログラムを頻繁に使用する場合、またはまだ250 GB以上のUSBドライブがない場合は問題が発生する可能性があります。
答え4
アプリケーションが検索可能な入出力を必要としない場合は、それを渡す/dev/stdout
か、<(gunzip <data.gz)
- 参照カムの答えそしてアレックスの答え。
アプリケーションに検索可能なファイルが必要な場合、最良のオプションは圧縮ファイルシステムを実装することです。圧縮をサポートするいくつかのUNIXファイルシステムの実装があります。
- 渡すヒューズ、ほとんどの unice で利用可能、一部圧縮ファイルシステム。ヒューズ圧縮そして複合ヒューズ2つのオプションがあり、さまざまなオプションがあります。アーカイブファイルシステム。
- ジブスキッチンシンクと圧縮を含むすべてをサポートします。これは今日、Solaris(その起源)の基本ファイルシステムです。それヒューズを通して利用可能少なくともLinuxでは。 FreeBSDとNetBSDには、少なくとも部分的にzfsの基本的な実装があります。
- Linux には ext2 とその派生の圧縮を有効にするパッチがあります。どれくらい安定しているのか、ext3とext4とどれくらい互換性があるのかわかりません。