VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2004/02/25(Wed) 22:11
投稿者竜牙
URL
タイトルファイル処理の高速化

こんばんは、はじめまして。竜牙と申します。
現在駆け出しのプログラマーをしておりまして、
こちらのHPには学生のころからお世話になっております。

実は折り入ってお聞きしたいことがござまして、掲示板の方
に書き込みをさせていただかせていただきました。

ファイルの処理の高速化についてなのですが、ループで何十万
件もあるファイルを読み込みテーブルに挿入する、という処理
をする場合下記以外にどのような方法がございますでしょうか?

開発環境はWindows2000とSQLServerです。
スペックについては・・・・すみません、詳しくは解りませんがあまり
良い方ではないです。

ファイルの形態は以下の通りです。
同一アルファベットが項目の文字列です。
AAABBBBBBBCCDDEEEEEEEEGGHHHHHHHHIIIIIIII(リターンコード)
AAABBBBBBBCCDDEEEEEEEEGGHHHHHHHHIIIIIIII(リターンコード)
AAABBBBBBBCCDDEEEEEEEEGGHHHHHHHHIIIIIIII(リターンコード)
AAABBBBBBBCCDDEEEEEEEEGGHHHHHHHHIIIIIIII(リターンコード)



(A:Code1 B:Code2 C:Code3 D:Code4
E:Date1 G:Code5 H:Comment I:Date2)

以下が自分なりに組んでみた処理のソースです
(RSは ADODB RecordSet で、ConectionはすでにOpenした後と
考えてください)

1:インプットファイルで項目ごとデータを読み出す
   strFileName = "E:\File.DAT"
   intFileNum = FreeFile

    Open strFileName For Input As #intFileNum

        Do Until EOF(intFileNum)
  
                Code1 = Input(3, #intFileNum)
                Code2 = Input(7, #intFileNum)
                Code3 = Input(2, #intFileNum)
                Code4 = Input(2, #intFileNum)
                Date1 = Input(8, #intFileNum)
                Code5 = Input(2, #intFileNum)
                Comment = Input(8, #intFileNum)
                Date2 = Input(8, #intFileNum)
                Returns = Input(2, #intFileNum)
        
        
            strA = "INSERT INTO Table " _
                 & "VALUES ( '" & Code1 & "','" _
                 & Code2 & "','" _
                 & Code3 & "','" _
                 & Code4 & "','" _
                 & Date1 & "','" _
                 & Code5 & "','" _
                 & Comment & "','" _
                 & Date2 & "')"
            
            Conection.Execute strA, , adCmdText            
       Loop
    
    Close #intFileNum
    RS.Close
    Set RS = Nothing

2:Getで値を取得する
   strFileName = "E:\File.DAT"
    intFileNum = FreeFile
                
    RS.Open "SELECT * FROM Table",cn
    
    Code1 = String(3, " ")
    Code2 = String(7, " ")
    Code3 = String(2, " ")
    Code4 = String(2, " ")
    Date1 = String(8, " ")
    Code5 = String(2, " ")
    Comment = String(8, " ")
    Date2 = String(8, " ")
    Returns = String(2, " ")

    Open strFileName For Binary As #intFileNum
    Do Until EOF(intFileNum)

        strB = Space(42)
        Get #intFileNum, , strB
        Code1 = Mid(strB, 1, 3)
        Code2 = Mid(strB, 4 ,7)
        Code3 = Mid(strB, 11, 2)
        Code4 = Mid(strB, 13, 2)
        Date1 = Mid(strB, 15, 8)
        Code5 = Mid(strB, 23, 2)
        Comment = Mid(strB, 25, 8)
        Date2 = Mid(strB, 33, 8)
        Returns = Mid(strB, 41)
          
        RS.AddNew
            RS!Code1 = Code1
            RS!Code2 = Code2
            RS!Code3 = Code3
            RS!Code4 = Code4
            RS!Date1 = Date1
            RS!Code5 = Code5
            RS!Comment = Comment
            RS!Date2 = Date2
        RS.Update
        
    Loop
    Close #intFileNum
    
    RS.Close
    Set RS = Nothing

この1,2の方法で20万件のデータを処理しましたところ
平均5分(300秒)という処理速度でした。
この方法よりも早くファイルを処理できる方法はありませんでしょうか。
ここをこうした方がはやくなるのでは、という意見でも、
こういう処理方法がある、という意見でもかまいません。
どうかご意見の方、よろしくお願い致します。

長くなってしまってすいませんでした。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -