私はかつて50,000行を超えるテキストを処理していた* nixシステムにPerlスクリプトを持っています。少し時間がかかります。私はこれらのテキストの処理中にプログラムが中断されないことをユーザーに知らせるためのリソースに優しい方法を見つけようとしています。
現在、テキストの処理中にリアルタイムで出力を印刷しています。出力バッファをフラッシュしてから、1行に出力を印刷します\r
。何も印刷しない場合よりもほぼ2倍の時間がかかるため、不要なリソースの使用のように見えますが、私が言ったように何も印刷しないと、プログラムは中断されたようです。
だから私の質問は:長期実行タスクを実行するときにプログラムが実際に実行されていることをユーザーに知らせるための標準または簡単な方法はありますか?
答え1
[あなたの台本だけ真珠ただし、同じロジックが適用されますprint "\r"
。STDERR
バッファリングを有効または無効にする必要があります$| = 1
。下部を参照してください。 ]
CLI「進行インジケータ」を実装する1つの方法は、\r
(キャリッジリターン)文字を使用することです。これにより、カーソルが現在の行の先頭に移動します。
#!/bin/bash
count=0
while ((1)); do
echo -ne "\rCount: $count"
sleep 1;
count=$(($count+1));
done
話せない場合は試してみてください。
この手法を使用して、これまでに処理された行数または数千の行を表すことができます。数十行または数百行はあまり頻繁ではないため、大丈夫かもしれませんが(より多くの更新 = 遅いランタイム)、進行が続いていることを示すのに十分な頻度があります。単位を指定するか、0を追加できます。
-n
-e
との使用に注意してくださいecho
。これが重要です。
\b
(バックスペース)を使って同様の効果を得ることもできます。
パールでは:
#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);
$| = 1; # Pipeline stdout (i.e., no buffering).
my $count = 1;
while ($count) {
print "\rCount $count";
sleep 1;
$count++;
}
答え2
.
処理中に改行文字をエコーせずに印刷します。古代の技術。
だからあなたは次のようになります:
Processing...............
シンプルで効果的です。