ngram-merge
SRILMのプログラムを使用して、複数の言語モデル(LM)カウントファイルをマージしたいと思います。このプログラムを使用すると、計算されたファイルのディレクトリ全体をマージできますngram-merge -write combined_file -- folder/*
。しかし、私が持っているデータの量に応じて数日間実行されるので、ファイルを並列にマージしたいと思います!
以下のスクリプトはデフォルトで次のことを行います。
- ディレクトリ内のファイルを同じサイズの2つのセットに分割します。 (ファイル数が奇数の場合は、セットを構成する前に2つのファイルをマージしてください。)
- コレクションを繰り返して、2つのファイルをマージして新しいファイルを新しいサブディレクトリに書き込みます(これは並列に実行する必要があります)。
- 新しいサブディレクトリにファイルが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