7

非常に大きなテキスト ファイルを読み書きするプログラムがあります。ただし、これらのファイルの形式 (バイナリ データであるべきものの ASCII 表現) のため、これらのファイルは実際には非常に簡単に圧縮されます。たとえば、これらのファイルの一部はサイズが 10GB を超えていますが、gzip は 95% の圧縮率を達成しています。

プログラムを変更することはできませんが、ディスク容量は貴重なので、これらのファイルが透過的に圧縮および解凍されている間に、これらのファイルを読み書きできるように設定する必要があります。

プログラムはファイルの読み取りと書き込みしかできないため、私が理解している限り、入力と出力の両方に名前付きパイプを設定する必要があります。代わりに圧縮ファイルシステムを提案している人もいますが、これも機能するようです。どちらかを機能させるにはどうすればよいですか?

技術情報: 最新の Linux を使用しています。プログラムは、個別の入力ファイルと出力ファイルを読み取ります。入力ファイルを順番に、ただし 2 回読み取ります。出力ファイルを順番に書き込みます。

4

5 に答える 5

5

zlibc をチェックしてください: http://zlibc.linux.lu/

また、FUSE がオプションである場合 (つまり、カーネルが古すぎない場合) は、以下を検討してください: compFUSEd http://www.biggerbytes.be/

于 2009-04-16T08:02:26.850 に答える
2

btrfs:

https://btrfs.wiki.kernel.org/index.php/Main_Page

最近では非常に高速な「自動透過圧縮/解凍」のサポートを提供し、新しいカーネルには (実験的とマークされていますが) 存在します。

于 2013-03-20T19:40:43.143 に答える
2

名前付きパイプは全二重操作を提供しないため、ファイル名を 1 つだけ指定する必要がある場合は、もう少し複雑になります。

アプリケーションがファイルをシークする必要があるかどうか知っていますか?

あなたのアプリケーションは標準入力、標準出力で動作しますか?

おそらく解決策は、ファイルを含むディレクトリのみを含むミニ圧縮ファイルシステムを作成することです

個別の入力ファイルと出力ファイルがあるため、次のことができます。

mkfifo readfifo
mkfifo writefifo
zcat your inputfile > readfifo &
gzip writefifo > youroutputfile &

launch your program !

zcat が入力ファイルの読み取りを完了するとすぐに、yout プログラムが SIGPIPE シグナルを受け取るため、入力の順序で 2 回読み取りを行うと、おそらく問題が発生するでしょう。

適切な解決策は、おそらく CompFUSE のような圧縮ファイル システムを使用することです。これにより、シークなどのサポートされていない操作について心配する必要がなくなります。

于 2009-04-16T08:00:41.860 に答える
1

FUSE オプション: http://apps.sourceforge.net/mediawiki/fuse/index.php?title=CompressedFileSystems

于 2009-04-16T10:18:48.340 に答える
-1

どの言語を使用していますか?

Java を使用している場合は、API ドキュメントの GZipInputStream および GZipOutputStream クラスを参照してください。

C/C++ を使用している場合は、おそらく zlibc が最適な方法です。

于 2009-04-16T08:11:21.930 に答える