投稿日 | : 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秒)という処理速度でした。
この方法よりも早くファイルを処理できる方法はありませんでしょうか。
ここをこうした方がはやくなるのでは、という意見でも、
こういう処理方法がある、という意見でもかまいません。
どうかご意見の方、よろしくお願い致します。
長くなってしまってすいませんでした。