tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルテキストファイルの高速検索
記事No14604
投稿日: 2010/04/07(Wed) 00:21
投稿者どっぽん
単なるテキストファイルなのですが、サイズが大きく100Mbyteくらいあり、LineInput関数で読んでは、単純文字比較で検索していますが、時間がかかりすぎます。高速で処理する方法はあるでしょうか?
現在は単純に
Line Input #1, S
としています。

[ツリー表示へ]
タイトルRe: テキストファイルの高速検索
記事No14606
投稿日: 2010/04/07(Wed) 01:36
投稿者魔界の仮面弁士
> 時間がかかりすぎます。
読み込みに時間がかかっているのでしょうか。
それとも、比較に時間がかかっているのでしょうか。

たとえば、検索処理を抜きにして、単に全データを読み捨てるようにした場合、
どの程度の時間がかかっていますか?

[ツリー表示へ]
タイトルRe^2: テキストファイルの高速検索
記事No14608
投稿日: 2010/04/07(Wed) 08:48
投稿者どっぽん
単に遅いと表現しましたが、現在テキストファイル100Mくらいですが、
今後3倍(3ファイル)くらいになると思われるので、遅くなるのか〜と思い、遅いと表現してしまいました。
それで他に方法はあるのかな?と思い、質問となったわけです。
現在7秒は待てない時間ではありません。


'読み飛ばし前
    Open tfpath & ffName For Input As #1
    Open tfpath & tmpfName For Output As #2
    dno = 0
    Do
        Line Input #1, S
        a = InStr(S, stext)
        If a <> 0 Then
            If dno > 1000 Then GoTo er2
            dno = dno + 1
            Call AddItemAndSetScrollBar(Form1.List1, S)
            Print #2, S
            tmp_t = S
        End If
    Loop Until EOF(L)
    Close #1
    Close #2



'読み飛ばし後
    L = FreeFile
    Open tfpath & ffName For Input As #1
    Do
        Line Input #1, S
    Loop Until EOF(L)
    Close #1

どちらも7秒くらいで変わりません。

[ツリー表示へ]
タイトルRe^3: テキストファイルの高速検索
記事No14609
投稿日: 2010/04/07(Wed) 11:12
投稿者魔界の仮面弁士
> どちらも7秒くらいで変わりません。

という事は、検索にかかる時間は無視できるという事ですね。

テキストファイルの読み込みに使うものとしては、以下のような手段があります。
SJIS / Unicode 変換のボトルネックもあるので、テキスト読み込みだけではなく
バイナリ読み込みの手段についても列挙しています。

とりあえず、100MB 全データを読み捨てる実験コードを書いてみて、
それぞれの処理速度やコードの可読性を調べてみては如何でしょう。


(1) Line Input # で一行ずつ読み込み。
 → 現在利用している方法。

(2) バイナリモードで Byte 配列に Get# し、StrConv で Unicode 化。
 → 読み込みバッファサイズと、末尾文字の分断制御に注意。
  Unicode 化せず、検索も(InStrB 等で)バイナリのまま行うという選択肢もあるかも。

(3) Input 関数(≠Input # ステートメント)でバイナリを読み込み、StrConv で Unicode 化。
 → 注意点については(2)と同様。

(4) FileSystemObject の TextStream で読み込み。
 → ReadAll は今回使い物にならないと思うので、ReadLine で読み込む事になるかと。

(5) ADODB.Stream のテキストモードで読み込み。
 → adReadAll 指定は今回使えないので、adReadLine か文字数指定で。

(6) ADODB.Stream のバイナリモードで読み込み、StrConv で Unicode 化。
 → (5) よりは高速だが、(2),(3) と同様の問題を考慮する必要がある。

(7) ODBC あるいは Jet の Text I-ISAM ドライバによる読み込み。
 → Format をカスタム定義にして、そこに未使用文字を指定する必要がある。
  http://msdn.microsoft.com/en-us/library/ms709353.aspx

(8) ReadFile API による読み込み制御。
 → 下記に、大容量ファイルの読み込みパフォーマンスについての話がありました。
  http://d.hatena.ne.jp/wraith13/20080430/1209565632

[ツリー表示へ]