
一部のデータを処理した後、特定の数のデータポイント(1行に1つ)を含むファイルを取得します。これらのデータポイントをより多くの数値処理を実行する他のツールに渡す必要があります。そのツールで特定の実行に対して「配置サイズ」を設定する必要があります。
./gen_data.sh > data.txt
./process_data.sh < data.txt > parsed.bin
./crunch_data.sh --total=$(wc -l < data.txt) --batch_size=N --infile=parsed.bin
バッチサイズがN
小さすぎると処理に時間がかかり、バッチサイズが大きすぎると出力品質が低下します。バッチサイズはで与えられたデータポイントの数で割る必要がありますM=$(wc -l < data.txt)
。N
周囲の価値はM/10
かなり良いようです。バッチサイズが奇妙な状況で奇妙なことをする場合(例えば、少数のN=M
場合はM
ほとんど確実に発生しないので心配しない)、特に問題はありません。
シェルツールを使用してこれを行うためのきちんとした方法はありますか?私はM
の引数を得ることができることを知っていますfactor
。 Pythonでは、次のように書くことができます。
total_portion = 1
for factor in factors(M):
total_portion *= factor
if total_portion > 10:
return M/total_portion
今私が得たスコアは、要素の数に応じてM
1/10よりわずかに小さいです。M
シェルスクリプトを使ってこれを行う方法、またはそれをより簡単にするためにどのツールを使用できるのかわかりません。これはうまくいけますか?要素のリストを小さなPythonスクリプトに渡し、そこでロジックを実行する方が良いですか?
答え1
以下は、GNUを使用したPythonアルゴリズムのシェルバージョンですfactor
。
#! /bin/bash
function total_portion() {
local M="$1"
local total_portion=1
for factor in $(factor "$M" | sed -e 's/^[0-9]\+: //'); do
((total_portion *= factor))
if [ "$total_portion" -gt 10 ] ; then
echo $((M / total_portion))
return
fi
done
}
M=$(wc -l < data.txt)
tp=$(total_portion "$M")