Macなどで大きなパッケージファイルを処理する

どういうわけか、ログファイルを処理するタスクがありました。 原則として、タスクはありふれたもので、LinuxとWindowsの両方でPerlを使用しています。 しかし、実際には、これはすべてMac上で行われ、ファイルはアーカイブ内にあり、サイズが大きいということです。 解凍すると、約20 GBかかります。

通常の解決策は何ですか?



ファイルが小さい場合は、アーカイブから取得してスクリプト入力に送信するだけです。 しかし、これはそうではなく、ディスクスペースを消費するのは残念です。 これを行うには、STDOUTでファイルをアンパックし、STDINのハンドラーで(名前のないパイプ、シンボル「|」を介して)すぐにピックアップする標準ソリューションがあります。 すぐに言ってやった。 標準のMacアンパッカーには、このオプションがあります。

unzip -p data.zip log.txt | process.pl > result.txt
      
      





ここで、process.plはログハンドラーです。

小さなファイルでテストした後、すべてがデバッグされ、作業ファイルに切り替えました。 しかし、それから驚きが待っていました。 ファイルは即座に処理されましたが、結果は空でした。 4 GBを超えるファイルは解凍されないことが判明しました。 ハハ、これは64ビットOSです。 グーグルで調べたところ、はい、そのような問題があることがわかりました。 彼らは、ファイルをパックすることはできますが、抽出はできないとさえ言います。 説明によれば、提供されたプログラムのいくつかは良かった。たとえば、The Unarchiver(http://wakaba.c3.cx/s/apps/unarchiver.html)でしたが、グラフィカルインターフェイスしかありませんでした。もちろん、これはMacです。 幸いなことに、コマンドラインで作業できる同じ作成者による別のユーティリティunar(http://code.google.com/p/theunarchiver/downloads/list)が見つかりました。 すべてがクールですが、...彼女は元の名前でのみファイルに展開できます。 そして何をすべきか? 私はすでに別のものを探すことにしましたが、名前付きパイプ(名前付きパイプ)を思い出しました。これにより、ディスク上に擬似ファイルを作成できます。パイプラインとして機能し、1つのプログラムが書き込み、ファイル。 つまり、アクションプランは次のとおりでした。



1.パックされたファイルと一致する名前の名前付きパイプを作成します。

 mkfifo log.txt
      
      





2.ハンドラーを実行し、ハンドラーからデータを読み取ります。 バックグラウンドで動作するように&記号を付けて実行します。そうしないと、データを待機し、完全な処理が完了するまで端末を解放しません。

 ./process.pl <log.txt >results.txt &
      
      





3.これで、開梱を開始できます。

 ./unar -D -f data.zip log.txt
      
      





-Dオプションはディレクトリを作成しません。

-f同じ名前のファイルが既に存在する場合は無視します。

4.作業が終了したら、名前付きパイプを削除します。

 unlink log.txt
      
      





すべてがうまくいき、すべてが機能します。 当然、上記のすべてを通常のLinuxで使用できます。



All Articles