0

ファイルに書き込まれている間隔(おそらく1分)あたりの行数に関する統計を取得できるPythonスクリプトを作成することに興味があります。データが入ってくると書き込まれるファイルがあります。ユーザーごとに新しい行が外部プログラムを介してデータを渡します。xあたりの行数を知ることで、将来の拡張計画に使用できるメトリックが得られます。出力ファイルは行で構成され、すべて比較的同じ長さで、すべて最後に行が返されます。私は次のようなスクリプトを書くことを考えていました:特定のポイントでファイルの長さを測定し、その後別のポイントでそれを再度測定し、2を引いて結果を得る...しかし私は知りませんファイルの長さを測定するのに時間がかかり、結果が歪む可能性があるため、これが理想的な場合。他に何かアイデアはありますか?

人々が言っ​​ていることに基づいて、私はこれを一緒に投げて始めました:

import os
import subprocess
import time
from daemon import runner
#import daemon

inputfilename="/home/data/testdata.txt"

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/count.pid'
        self.pidfile_timeout = 5
    def run(self):
        while True:
            count = 0

            FILEIN = open(inputfilename, 'rb')
            while 1:
              buffer = FILEIN.read(8192*1024)
              if not buffer: break
              count += buffer.count('\n')
            FILEIN.close(  )
            print count
            # set the sleep time for repeated action here:
            time.sleep(60)

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

それは60秒ごとにカウントを取得し、それを画面に出力する仕事をします。私の次のステップは私が推測する数学です。

もう1つの編集:1分間隔でカウントの出力を追加しました:

import os
import subprocess
import time
from daemon import runner
#import daemon

inputfilename="/home/data/testdata.txt"


class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/twitter_counter.pid'
        self.pidfile_timeout = 5
    def run(self):
        counter1 = 0
        while True:
            count = 0

            FILEIN = open(inputfilename, 'rb')
            while 1:
              buffer = FILEIN.read(8192*1024)
              if not buffer: break
              count += buffer.count('\n')
            FILEIN.close(  )

            print count - counter1

            counter1 = count
            # set the sleep time for repeated action here:
            time.sleep(60)

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
4

1 に答える 1

1

あなたのアイデア(私にはかなり聞こえるようです)についてコメントするには、測定をどの程度正確にする必要がありますか?

最初に測定時間を測定することをお勧めします。次に、達成したい相対精度を指定して、連続する測定間の時間間隔を計算できます。たとえば、測定にtミリ秒かかり、1%の精度が必要な場合は、 100tミリ秒に1回以上測定しないでください。

ファイルが大きくなるにつれて測定時間は長くなりますが、それを覚えておく必要があります。

ファイルの行数を数える方法のヒント:ファイルをスニッフィングするためのUNIXの「wc」に類似した組み込みのPythonはありますか?

時間の測定方法に関するヒント:timeモジュール。

PS245Mファイルでラインカウンターのタイミングを調整してみました。初回は約10秒かかりましたが(最初の実行では時間を計りませんでした)、その後は常に1秒未満でした。たぶん、そこでキャッシュが行われているのかもしれませんが、よくわかりません。

于 2012-05-17T19:12:46.290 に答える