C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 46 を表示中)
■25037 / )  Re[1]: Split関数の代替について
□投稿者/ 魔界の仮面弁士 (852回)-(2008/09/14(Sun) 11:36:34)
No25034 (なかた さん) に返信
> はじめまして。VB6.0でCSVをファイルマッピングで読み込み、
CreateFileMapping API 等でしょうか?


> Splitで改行コード(vbcrlf)で配列に分割するのに30秒〜40秒くらいかかります。
これはつまり、
 Dim csv As String
 csv = [サイズ40MB相当の文字列]
の処理は、(ファイルマッピング等により)数秒程度まで短縮できたが、その後の
 list = Split( [サイズ40MB相当の文字列], vbCrLf)
の処理に、数十秒かかるという事でしょうか?


手元の環境で試してみましたが、15列×3.6万行の CSV データ
(サイズでいうと、45,961,380 バイト) のファイルでも、API 無しで
読み込みから Split まで、6 秒未満程度で完了するのですが…。


Option Explicit

Private CSV As String
Private rows() As String
Private Sub Command1_Click()
    Dim before As Single
    Dim after As Single
    before = Timer
    
    rows = Split(CSV, vbCrLf)
    
    after = Timer
    Debug.Print "Split:"; after - before, "("; before, after; ")"
End Sub

Private Sub Form_Load()
    Dim before As Single
    Dim after As Single
    before = Timer

    Dim stm As ADODB.Stream
    Set stm = New ADODB.Stream
    stm.Type = adTypeBinary
    stm.Open
    stm.LoadFromFile "C:\Book1.csv"
    Dim b() As Byte
    b = stm.Read(adReadAll) '
    stm.Close
    CSV = StrConv(b, vbUnicode)

    after = Timer
    Debug.Print " Load:"; after - before, "("; before, after; ")"
End Sub

返信 編集キー/


管理者用

- Child Tree -