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

わんくま同盟

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

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


(過去ログ 80 を表示中)
■47172 / )  Re[11]: CSVファイル入出力時の速度向上方法について
□投稿者/ おたすけ ひでやん (1回)-(2010/02/19(Fri) 22:13:11)
No47047 (みきぬ さん) に返信
> ■No47041 (こあら さん) に返信
>>>>VBScriptでADODB.Streamを使って「一行ずつ」と「残り一括」を比較したら、雲泥の差でしたよ。
>>
> >>この結果から何が導かれるのか分からないので、補足を希望します。
>>
>>「同じ出力ファイルを作るのに、手続きによって処理時間が異なる」です。
>>
> やり方によってはそういう場合もあるということはわかります。
>
> ただ今回の話では、元質問者から具体的なコードが提示されています。
> わざわざ別のやり方で結果を示す理由がわからなかったのです。
> # VB6 の確認環境がないから、とかならわかるんだけど
>
> さらに言うと、私から見たこあらさんのやりかたは、元質問者の方法を「わざわざ遅くしている」ようにも見えました。
> こあらさんのやり方で雲泥の差が出ても、それが元質問者の方法でもそのような結果になるかというと、関係がないと思うのです。
> # ADODB.Stream を知らない(CSV ファイルを DB のように扱ってるのかなあ、くらいの理解)し、
> # 確認できる環境も持ってないので、このへんは単なる勘ですが

割り込み失礼します。
私も、上記考えと一緒です。streemを使ったほうが早いです。
ちなみに、vb.net でstreemを使わずに、30万件のCSVを出力すると約 7Sかかりました。
streemを使用して入力および出力を30万件行った結果、400msで済みます。
なお、streemを使用した場合で、たとえば内部配列に複数レコード読み込んで、一気に読み込んだ分を書き込んでも
入出力時間は変わりませんでした。(下記ソースにて実施)
これは、お使いの環境によって変わってくると思いますけど、ちなみに実施した環境は、
   
   processer Intel(R) Core(TM)2 CPU 6600 @2.40GHz(2 CPUs)
   mem: 2046MB RAM

   (まあ、どこにでもある普通のpcです。)

参考までに使用したソースを掲載しておきます。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim FileAccHd As New CommonClassLibrary1.FileAcc
Dim seq As Long = 0
Dim starttime As DateTime = DateTime.Now
Dim StiMillisecond As Integer = starttime.Millisecond


Dim RecCnt As Integer
Dim TTLRecCnt As Long = 0
Dim BuffNum As Integer = TextBox5.Text
STreemFileOpen("testData01.csv")
WriteFileOpen("testData01wr.csv")
RecCnt = 999
While RecCnt > 0
RecCnt = FileRead("testData01.csv", BuffNum)
Writes("testData01wr.csv")
TTLRecCnt = TTLRecCnt + RecCnt
End While
STreemFileClose()
WriteFileClose()
Dim endtime As DateTime = DateTime.Now
Dim EdiMillisecond As Integer = endtime.Millisecond
TextBox4.Text = TTLRecCnt '処理した件数
TextBox2.Text = starttime & ":" & StiMillisecond '開始時間
TextBox3.Text = endtime & ":" & EdiMillisecond '終了時間

End Sub
Private pRecords() As String
Private pSr As System.IO.StreamReader
Public Sub STreemFileOpen(ByVal FileName As String)
Dim sr As New System.IO.StreamReader(FileName, _
System.Text.Encoding.GetEncoding(932))
pSr = sr
End Sub
Public ReadOnly Property FileRead(ByVal FileName As String, ByVal BuffNum As Integer)
Get
Dim i As Long = 0
Dim record As String
pRecords = Nothing
ReDim Preserve pRecords(BuffNum)
'複数のレコードを一気によみバッファへ格納
While pSr.Peek() > -1
If i <= pRecords.Length - 1 Then
record = pSr.ReadLine()
pRecords(i) = record
i += 1
Else
Exit While
End If
End While
Return i
End Get
End Property
Public Sub STreemFileClose()
'閉じる
pSr.Close()
End Sub
Private pSrWrite As System.IO.StreamWriter
Public Sub WriteFileOpen(ByVal FileName)
Dim SrWrite As New System.IO.StreamWriter(FileName, False, System.Text.Encoding.GetEncoding("shift_jis"))
pSrWrite = SrWrite
End Sub
Private pFileNum As Integer
'複数のレコードをファイルへ書きこむ
Public Sub Writes(ByVal FileName)
Dim FileNum As Integer = FreeFile()
Dim idx As Integer
Dim Line As String = ""
For idx = 0 To pRecords.Length - 1
Try
pSrWrite.Write(pRecords(idx))
Catch ex As Exception
WriteFileClose()
Exit For
End Try
Next
End Sub
Public Sub WriteFileClose()
pSrWrite.Close()
End Sub

使用したデータ内容

Data1,xxxxxxxxxxxxxxxxxxxxxxxx,0,yyyyyyyy
Data1,xxxxxxxxxxxxxxxxxxxxxxxx,1,yyyyyyyy
Data1,xxxxxxxxxxxxxxxxxxxxxxxx,2,yyyyyyyy
 |
 |
 30万件
返信 編集キー/


管理者用

- Child Tree -