ファイルが1つだけ残るまで、ファイルをペアで並列にマージします。

ファイルが1つだけ残るまで、ファイルをペアで並列にマージします。

ngram-mergeSRILMのプログラムを使用して、複数の言語モデル(LM)カウントファイルをマージしたいと思います。このプログラムを使用すると、計算されたファイルのディレクトリ全体をマージできますngram-merge -write combined_file -- folder/*。しかし、私が持っているデータの量に応じて数日間実行されるので、ファイルを並列にマージしたいと思います!

以下のスクリプトはデフォルトで次のことを行います。

  1. ディレクトリ内のファイルを同じサイズの2つのセットに分割します。 (ファイル数が奇数の場合は、セットを構成する前に2つのファイルをマージしてください。)
  2. コレクションを繰り返して、2つのファイルをマージして新しいファイルを新しいサブディレクトリに書き込みます(これは並列に実行する必要があります)。
  3. 新しいサブディレクトリにファイルが1つしかないことを確認し、そうでない場合1.新しく作成されたサブディレクトリから再起動します。

残念ながら、スクリプトは機能しますが、ngram-mergeコマンドは並列にコンパイルされません。この問題を修正できますか?そして動的に作成されたフォルダ構造も少し見苦しくなります。そして私はシェルの専門家ではありません。したがって、すべてをよりエレガントにするすべてのコメントに感謝します!ありがとうございます:-)

#!/bin/bash

# Get arguments
indir=$1
# Count number of files
number="$(ls -1 $indir | wc -l)"
# Determine number of cores to be used in parallel
N=40

# While more than one file, combine files
while [ "$number" -gt 1 ]; do

    # determine splitpoint
    split="$((number/2))"
    # Determine whether number of files is odd
    if [ $((number%2)) -eq 1 ]
        # if it is odd, combine first and last file and rm last file
        then
            first="$indir$(ls -1 $indir | head -1)"
            last="$indir$(ls -1 $indir | tail -1)"
            new="$first""$last"
            /vol/customopt/lamachine.stable/bin/ngram-merge -write $new -- $first $last && rm -r $first $last
    fi

    # Determine first half of files and second half
    set1="$(ls -1 $indir | head -$split)"
    set2="$(ls -1 $indir | head -$((split*2)) | tail -$split)"
    # Make new dir
    newdir="$indir"merge/
    mkdir $newdir

    # Paralelly combine files pairwise and save output to new dir
    (
    for i in $(seq 1 $split); do
        file1="$indir$(echo $set1 | cut -d " " -f $i)"
        file2="$indir$(echo $set2 | cut -d " " -f $i)"
        newfile="$newdir""$i".counts
        /vol/customopt/lamachine.stable/bin/ngram-merge -write $newfile -- $file1 $file2 && rm -r $file $file2
        ((i=i%N)); ((i++==0)) && wait
    done
    )

    # Set indir = newdir and recalculate number of files
    indir=$newdir
    number="$(ls -1 $indir | wc -l)"

done

答え1

わからないngram-mergeので、以下を使用してくださいcat

n=$(ls | wc -l)
while [ $n -gt 1 ]; do
  parallel -N2 '[ -z "{2}" ] || (cat {1} {2} > '$n'.{#} && rm -r {} )' ::: *;
  n=$(ls | wc -l);
done

しかし、次のように見えます。

n=$(ls | wc -l)
while [ $n -gt 1 ]; do
  parallel -N2 '[ -z "{2}" ] || ( /vol/customopt/lamachine.stable/bin/ngram-merge -write '$n'.{#} -- {1} {2} && rm -r {} )' ::: *;
  n=$(ls | wc -l)
done

関連情報