2011-07-12 3 views
3

出力ログに使用する別のプログラマーのPerlスクリプトを修正しました。 perlスクリプトはファイルを通過し、すべてのファイルについて、ログをopen()し、write/printしてからclose()します。これは何度も起こります。私はPerlスクリプトがハングアップすると(それはやっとそれをやり始め、私はそれを修正するのに十分な知識がありません)、データを失わないようにこれを行います。したがって、私はそのループでopen()とclose()を繰り返す良い選択肢はありません。速度が問題でなければ、ループでopen()とclose()を実行するのは悪いですか?

私の主な質問はこれです:Perlスクリプトは個人用ですので、速度の低下は問題ではありません。しかし、オープン/クローズのこのような不適切な使用の可能性がある他の悪いことがありますか?それは愚かな質問のように聞こえるかもしれませんが、これは私のハードディスクを早く落とす可能性がありますか、または私はファイル処理の仕組みを誤解していますか?

ありがとうございます。

答えて

4

理論的には、できるだけ早く接続を開いたり閉じたりするのが一般的です。ファイルも変わりません。実行する2つのことは、ファイルのロックとパフォーマンスです。

他のユーザーがファイルに同時にアクセスすると、ファイルのロックが発生する可能性があります。

パフォーマンスは、前述したように、大きな問題ではありません。

オープン/クローズ操作を待つのライフタイムについては言及していません...並行処理が非常に多く、何十万という動作が見られます。

+0

ありがとうございます!私は両方の回答を選択できたらいいと思うが、イエス・ラモスの答えには、ファイルが開かれている間にスクリプトがクラッシュした場合に何が起こるかについての詳細がある。 – lvk

+0

ネモの答えが最善の答えです。 – tadmc

+0

それは後で投稿された、私はラモスの答えを事前に選択しました。 – lvk

2

OSはハードドライブアクセスを決定しますので、正常に動作するはずです。たくさんのファイルを開く()と閉じる()必要があるなら、それは大丈夫です。あなたが手動で編集した後に再開すると、データが失われる可能性があります(ただしこれはかなりまれなシナリオです)。また、あなたのスクリプトがクラッシュした場合、ディスクリプタはとにかく解放されるので、私が知る限り問題はありません。

+0

私はWindows 7を使用しています。 1週間または2週間ごとに約100,000回ファイルを開いて閉じる(閉じる)と、ハードディスクの摩耗が増加するリスクはありますか? – lvk

+0

OSはあなたの要求をバッファに入れ、ドライブの摩耗を減らします。明らかにあなたのドライブが磨耗を誘発するが、その無視できるほどの時間をスピンアップしている場合。 –

+0

しかし、あなたが100,000 close()を実行すると、OSはバッファを100,000回フラッシュします... – tadmc

11

他にも言及したように、パフォーマンス(およびおそらくコードのクリーンさ)以外に問題はありません。しかし

、あなただけのファイルハンドルに自動フラッシュ設定し、「Perlはハングアップした場合にデータを失うこと」について単に心配している場合:HANDLE

use IO::Handle; 
open HANDLE, '>log.txt' 
    or die "Unable to open log.txt for writing: $!"; 
HANDLE->autoflush(1); 

今、すべてのprintは自動的にフラッシュされます。開閉を続ける必要はありません。

詳細については、perldoc man pageの「autoflush」を検索してください。

+0

ありがとう、私はこれを最も確実に使用します。私はそのような「自動保存」機能がどのように名付けられたかを知らなかったので、グーグルは少し難しかった。 – lvk

関連する問題