5

現在のプロセス:

  1. ファイルがありtar.gzます。(実際、私はそれらを約2000個持っていますが、それは別の話です)。
  2. 一時ディレクトリを作成し、tar.gzファイルを抽出して、100,000個の小さなファイル(それぞれ約600バイト)を表示します。
  3. ファイルごとに、それを処理プログラムにキャットし、そのループを別の分析プログラムにパイプして、結果を保存します。

私が使用しているマシンの一時的なスペースは、これらのプロセスの1つを一度に処理することはほとんどできません。デフォルトで送信される、16(ハイパースレッドデュアルクアッドコア)を気にする必要はありません。ディスクに保存せずにこのプロセスを実行する方法を探しています。を使用してファイルを個別にプルすることによるパフォーマンスの低下tar -xf $file -O <targetname>は法外なものになると思いますが、それは私が立ち往生していることかもしれません。

これを行う方法はありますか?

編集:2人がすでにこの間違いを犯しているので、私は明確にするつもりです:

  • 各ファイルは1つの時点を表します。
  • 各ファイルは個別に処理されます。
  • 処理されると(この場合はフーリエ解析の変形)、それぞれが1行の出力を提供します。
  • この出力を組み合わせて、時間の経過に伴う自己相関などを行うことができます。

EDIT2:実際のコード:

for f in posns/*; do
    ~/data_analysis/intermediate_scattering_function < "$f"
done | ~/data_analysis/complex_autocorrelation.awk limit=1000 > inter_autocorr.txt
4

5 に答える 5

7

ファイル間の境界を気にしない場合は、必要な処理tar --to-stdout -xf $fileを実行します。アーカイブ内の各ファイルの内容を次々にstdoutに送信します。

これは、GNU tarを使用していることを前提としています。これは、bashを使用している場合にかなり可能性があります。

[アップデート]

各ファイルを個別に処理したいという制約を考えると、シェルスクリプトは間違ったツールであるというCharlesDuffyに同意します。

彼のPythonの提案を試すか、 Archive ::TarPerlモジュールを試すことができます。これらのいずれかを使用すると、メモリ内のtarファイルの内容を反復処理できます。

于 2012-06-19T00:00:15.873 に答える
4

これは、ジョブに適したツールがおそらくシェルスクリプトではない場合のように聞こえます。Pythonには、tarfileストリーミングモードで動作できるモジュールがあり、大きなアーカイブを1回だけ通過してそのファイルを処理しながら、個々のファイルを区別することができます(このtar --to-stdoutアプローチでは区別できません)。

于 2012-06-19T00:03:54.783 に答える
4

tarオプション--to-command=cmdを使用して、各ファイルのコマンドを実行できます。Tarは、ファイルの内容をコマンドの標準入力にリダイレクトし、TAR_FILENAMEなどのファイルに関する詳細を含むいくつかの環境変数を設定します。詳細については、TarDocumentationをご覧ください。

例えば

tar zxf file.tar.gz --to-command='./process.sh'

OSXはbsdtarデフォルトでこのオプションを使用しないことに注意してください。代わりに明示的に呼び出すことができますgnutar

于 2013-04-03T21:35:18.483 に答える
2

ramdisk(http://www.vanemery.com/Linux/Ramdisk/ramdisk.html)を使用して、RAMディスクを処理およびロードできます。(Linuxを使用していると大胆に想定していますが、他のUNIXシステムにも同じタイプのプロビジョニングが必要です)

于 2012-06-19T00:06:26.030 に答える
0
tar zxvf <file.tar.gz> <path_to_extract> --to-command=cat

上記のコマンドは、シェル上でのみ抽出されたファイルの内容を表示します。ディスクへの変更はありません。tarコマンドはGNUtarである必要があります。

サンプルログ:

$ cat file_a
aaaa
$ cat file_b
bbbb
$ cat file_c
cccc
$ tar zcvf file.tar.gz file_a file_b file_c
file_a
file_b
file_c
$ cd temp
$ ls <== no files in directory
$ tar zxvf ../file.tar.gz file_b --to-command=cat
file_b
bbbb
$ tar zxvf ../file.tar.gz file_a --to-command=cat
file_a
aaaa
$ ls  <== Even after tar extract - no files in directory. So, no changes to disk
$ tar --version
tar (GNU tar) 1.25
...
$
于 2015-08-11T09:11:06.703 に答える