0

現在、変数のリストを照合する Python 2.7 でコーディングされたスクリプトがあります。このスクリプトは、Linux OS 上のマシンで 24 時間実行されます。

私が探しているのは、データをこれらのリストからリモート サーバーに移動することです。このデータ転送は 3G インターネット接続を介して行われるため、データをローカルに書き込み、接続が利用可能になったときにデータを転送したいと考えています (カバレッジが悪いなどの理由で...)。

私の意図は、コード実行の開始時に、POSIX で実際の時間をキャプチャし、新しい .txt ファイルを作成することです。次に、開始時刻から 30 分後に計算し、この値も変数に追加します。スクリプトが継続的なループをチェックインして時間をチェックするつもりです。30 分の POSIX 値と一致する場合は、リストのすべての情報を .txt ファイルに書き込んでから、新しいテキスト ファイルを作成し、このプロセスを何度も繰り返します。次に、RSync を使用して .txt ファイルを中央サーバーに同期します。

これは、このプロセスを完了するための効率的な方法ですか? 前述のように、データをモバイル インターネット (3G) 経由でリモート サーバーに同期するため、カバレッジ エリアが不十分な場合があります。そのため、ファイルを同期する前にデータをローカルに書き込む方が簡単だと思います。

30 分ごとにファイルを作成することにしました。これにより、スクリプトが失敗したり、停電が発生したりした場合でも、失われるのは最大 30 分のデータであり、数時間分のデータは失われません。

私の思考過程についてフィードバックをお願いします。

ありがとう

4

2 に答える 2

1

あなたのデザインには効率的な問題はありません。

おそらくある種の重要な作業を行っている継続的なループがあります。現在の時刻を取得し、ループを通過するたびに 1 つの float 比較を行うコストを追加することは、何の違いも生じないことと比較して非常に安価になります。

ほとんどの場合、ループを介して重要な作業を行っていない場合、ループ自体がおそらく主要なパフォーマンス コストであり、ループを実行する頻度を減らした方がよいでしょう。

ただし、ファイルを開いて 30 分間空のままにしてから、一度にすべてを書き込み/閉じ/アップロードするのはかなり奇妙です。より良い解決策は、書き込む直前に作成することです。または、さらに良いのは、(リストを維持するのではなく)進行中に書き込み、数秒ごとにフラッシュしてから、30分ごとにクローズ/アップロード/置換することです。

一方、Python コードが 30 分ごとに何かを実行しようとしていて、cron ジョブもそうである場合、それらは明らかに同期していません。3G の問題により、何時間も同期がずれている可能性があると予想しているので、これはおそらく問題にはなりません。

最後に、あなたがしていることは、syslog スタイルのロギングとログ ローテーションにかなり近いものです。技術的には通常の意味でのログ ファイルではない場合でも、Linux および/または Python (特に、または他のハンドラの 1 つなど) で何ができるかを調べる価値があるかもsyslogしれlogrotateませloggingTimedRotatingFileHandler

于 2013-04-04T19:02:21.580 に答える
0

それが私がやろうとしていることです。

データを常に出力ファイルに書き込み、N レコードごとにフラッシュします。1 秒しか失われないのに、なぜ 30 分間分のデータをクラッシュで失うのでしょうか?

ファイルが特定のサイズになるか、30 分以上経過したら、ファイルを閉じてディレクトリに移動しますoutbound/。次に、出力ファイルとして新しいファイルを作成します。

別のスクリプトがアップロードを制御します。大まかな例:

inotifywait -q -m -e create /path/to/outbound | while read fpath cmd fname; do 
  fullpath=$f{fpath}/${fname}
  rsync $f{fullpath} remotehost && rm ${fullpath}
done

これは送信ディレクトリでの作成イベントをリッスンするため、スクリプトがそこにファイルを移動すると起動します。cronから継続的に実行rsyncすることも検討してください。rsync --remove-source-files

于 2013-04-04T19:11:51.613 に答える