2024年に成し遂げたこと

VBScript初心者です。

現在、あるファイル処理をするにあたり、メモリ・CPU負荷と、処理スピードの、
バランスの取れた方式を検討しようとしています。

やりたいこと:
 ある対象ファイルに対する検索処理です。
 対象ファイルはログファイルであり、全行に年月日日時分情報を含みます。
 やりたい検索処理は以下です。
  1.特定の時間帯(ex.13:00-15:00)の中に、キーワードAがあるかを検索
  2.特定の時間帯(ex.15:00-17:00)の中に、キーワードBがあるかを検索
  3.特定の時間帯(ex.13:00-17:00)の中に、キーワードCがあるかを検索
 ※「特定の時間帯」は1,2,3で異なりますが、ex.の通り、3の時間帯は1の時間帯+2の時間帯です。
  ※対象のログファイルは、「サイズが大きい=1GB以上」と前提してください。

現在考えている方式:
 対象のログファイルを、3の時間帯で切り出し別ファイルで保存
  →その「別ファイル」に対し1,2,3を実行
    ※検索は、ファイル内を1行ずつInStrする

知りたいこと:
 メモリ・CPU負荷をなるべく掛けずに、処理スピードの速い方式を適用したいと思っています。
 としたときに、「現在やろうとしている処理」を考えたのですが、
 他によさそうな処理方式があれば、ご教示をお願いします。

 「メモリ・CPU負荷を掛けない」と「処理スピードが速い」は両立するようなものでは
 ないとは思いますが、バランスというか、コーディングにおいて最適とされている
 作法みたいなものがあれば、知りたいと思っている次第です。

よろしくお願いします。

質問者からの補足コメント

  • ご紹介いただいたOpenMode.Randomについて調査してみたところ、
    余計わからなくなりました…
    VBScriptでOpenMode.Random(FileOpen関数)は使えるのでしょうか?

    初心者につき、VBScriptとVisualBasicの違いも分かっていません。
    その辺踏まえてご教示いただけると幸いです。

      補足日時:2015/10/13 00:30

A 回答 (5件)

> 特定の時間帯部分を一旦抽出して、それに対して1,2,3を実施したほうが効率が良いのかなと思いました。



で、その「特定の時間帯部分を一旦抽出」する方法って、「先頭から順番に全部の行を読んで、時間帯別に出力」ってなりませんか?


処理時間は
ファイルを分割して、対象時間帯だけで検索だと、
 全部読む+全部の行の時間帯を判定する+時間帯毎に書き出す+ 特定時間分だけ読み込む+キーワード検索する

#2で書いた方法では
 全部読む+全部の行の時間帯を判定する+(特定時間帯の場合に)キーワード検索する

となるでしょう。

前者は「時間帯毎に書き出す+特定時間分だけ読み込む」分長くなります。
(メモリ内で行われる)文字列からのキーワード検索等と比べて、ファイルの読み書きはとても時間のかかる処理です。
とても影響を無視できるものではありません。


これが
1'.特定の時間帯(ex.13:00-15:00)の中に、キーワードA'があるかを検索
1''.特定の時間帯(ex.13:00-15:00)の中に、キーワードA''があるかを検索
1'''.特定の時間帯(ex.13:00-15:00)の中に、キーワードA'''があるかを検索
....
等と同じファイルから、キーワードを変えて複数回検索するなら、 分割するために余分にかかった時間以上に、読み込むファイルを小さくしたことによる時間短縮が効果的になってきます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

別ファイルを作るコストと、1行ずつ検索するコストのバランスが重要と解釈しました。
今回は、同じファイルに対し検索するのは3種類程度のため、実測してみることにいたします。

お礼日時:2015/10/12 21:19

言葉が足らずですみません。


結局のところseekメソッドを使用しては?という提案のつもりでしたが、
どうやらVBScriptではseekが標準使用できる体系が存在していないようです。
混乱をさせてしまい申し訳ございません。
    • good
    • 0
この回答へのお礼

成程、承知しました。
補足いただきありがとうございました!

お礼日時:2015/10/14 00:39

1さんの方法が一番現実的ですが、


通常、そういう検索をする場合は
OpenMode.Randomでファイル検索を行うのが有効です。
ググって調査してみては?
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

OpenMode.Randomの情報ありがとうございました。
HITするかしないかを検索するだけなら、順アクセスよりランダムアクセスの方が
効率が良いと解釈しました。

お礼日時:2015/10/12 21:32

検索して、その後どうするのですか?




その処理内容によっては違う方法もあるかもしれませんが、
ファイル全体を一通り読み込む必要があるなら、次のような単純な方法が結局最適になっているのではないでしょうか?

(1)ReadLine で1行読みこむ
 https://msdn.microsoft.com/ja-jp/library/cc36443 …
(2) (1)で読み込んだ1行分の文字列について、 1.,2.,3.の処理をする
(3) ファイルの終わりまで (1)〜(2)を繰り返す


これが、同じファイルで何度も条件を変えて検索する、等となってくると、何かの工夫(データベースを使ってインデックスを付けるとか)があるといいかもしれませんが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

>検索して、その後どうするのですか?

検索するだけです。「HITした」「しなかった」という結果により、正常/エラーを判定するだけのプログラムです。

ファイル内の特定の時間帯部分だけを検索すればよいので、全行に対して1,2,3をするよりは
特定の時間帯部分を一旦抽出して、それに対して1,2,3を実施したほうが効率が良いのかな
と思いました。

お礼日時:2015/10/12 19:52

1GB以上とのことですが、ファイルサイズはどの程度でしょうか?1~2GB程度であればあまり効率を意識しなくていいと思いますが。



他の方法としては、事前にログファイルをfindstrコマンドでキーワードに引っかかるものだけど選択しておいてからVBSで読み込むというのもあるでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

>1GB以上とのことですが、ファイルサイズはどの程度でしょうか?1~2GB程度であればあまり効率を意識しなくていいと思いますが。

今やろうとしていること自体は、ファイルサイズ1GB程度のものを扱う予定です。

1GBファイルを対象に、簡単なサンプルを作って試しましたが、確かに2-3分もあれば終わるので、
意識しなくてもいいかもしれませんね。
ただ、後学のために、大容量ファイルを扱う場合のお作法も学んでおきたい次第です。

>他の方法としては、事前にログファイルをfindstrコマンドでキーワードに引っかかるものだけど選択しておいてからVBSで読み込むというのもあるでしょう。

findstrを使って事前加工する方式は、「対象のログファイルを、3の時間帯で切り出し別ファイルで保存」より負荷が軽い感じでしょうか?

お礼日時:2015/10/12 15:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報