|
■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万件
|