アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の解決方法をご教授願えませんでしょうか。
宜しくお願いいたします。

前提:ギガバイト単位のテキストファイル(サーバのログファイル)を扱うスクリプトを作成したい。
必須機能:grep機能、動作が軽快で早い事
 また、できるだけ外部ツールを使用したくない事(サーバ上に載せる事も視野に入る為)

私が行った事:
1. まずテキストファイルとしてgrepするスクリプトを作成。
 方法(1) ReadLineで1行ずつ読み込み、正規表現にてマッチする行を変数に格納
 その後、その変数をファイルに書き出ししてみた。
  ⇒処理速度が遅すぎて使い物にならない。
 方法(2) &演算に処理を食い、速度が遅くなる為、一度ファイルを読み込み
 正規表現にてマッチしない行を1度に削除し、新しいファイルに書き出してみた
  ⇒テストファイルだと狙った通りに処理がかなり早くなったが、実ファイルが
   ギガバイト単位の為、メモリオーバーフローを起こし使い物にならない
   (ま、そりゃそうだよねorz)
 方法(3) &演算に処理を食うのは避けたい為、ReadLineにて行毎に読み込み、
 正規表現にてマッチした行をWriteLineにてファイルに書き出し。
  ⇒(1)よりは早くなり、ひとまず完成。ただし、それでも処理が遅いのと
   CPUパワーを使う為に処理中他の作業がし辛いのが問題。

2. そこで、1度捨てた(2)の方法を何とか使えないかと思案し、ファイルを
  適当なサイズで分割する形にしようかと思い、以下の分割用スクリプトを作成
  ⇒でも、結局LoadFromFileにてメモリ上にファイルを展開する為、
   メモリオーバーフローを起こす事に。

要は、c言語のfreadみたいな事ができれば解決できると思うのですが…
この方法に限らず、何かいい案があればアドバイスをお願いいたします。

以下、バイナリーにて分割するスクリプト

Option Explicit
Const FilePath = "分割対象ファイルパス"
Const ReadLen = 134217728
Dim bytData, intX
intX = 0

With CreateObject("ADODB.Stream")
 .Open
 .Type = 1
 .LoadFromFile(FilePath)
 .Position = 0

 Do Until .EOS
  bytData = .Read(ReadLen)
  With CreateObject("ADODB.Stream")
   .Open
   .Type = 1
   .Write(bytData)
   .SaveToFile FilePath & "." & CStr(intX), 1
   .Close
  End With
  intX = intX + 1
 Loop
 .Close
End With

A 回答 (1件)

VBSCRIPTにこだわらないなら



http://www.atmarkit.co.jp/fwin2k/win2ktips/511fi …
    • good
    • 0
この回答へのお礼

ありがとうございます。
確かにWScript.Execからcmd.exeを呼び出して、findstrをつかえばいけますね。

お礼日時:2009/06/11 23:17

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

このQ&Aを見た人はこんなQ&Aも見ています