2017-11-10 6 views
0

SQLiteでvb.net(.NETFramework、Version = v4.5.2)を使用しています。
私は52000行のテーブルを持っており、それぞれをcsvファイルを作成する目的で繰り返しなければなりません。

これは私のコードですが、とてもシンプルです。すべてのデータテーブルの行の反復が前のものより遅い

Dim text As String 
    Dim dtRows As Integer 
    Dim dtColumns As Integer 

    text = "" 
    dtRows = dt.Rows.Count - 1 
    dtColumns = dt.Columns.Count - 1 

    'set column header' 

    For y As Integer = 0 To dtColumns 
     text &= dt.Columns.Item(y).ColumnName.ToString 
     If (y <> dtColumns) Then 
      text &= ";" 
     End If 
    Next 
    textOnlyColumn = text 
    text &= vbCrLf 

    For x As Integer = 0 To dtRows 
     'set row values' 
     For y As Integer = 0 To dtColumns 
      text &= dt(x)(y) 
      If (y <> dtColumns) Then 
       text &= ";" 
      Else 
       text &= vbCrLf 
      End If 
     Next 

     If (x Mod 300 = 0 And x <> 0) Then 
      WriteIntoFile(fileName, text) 
      text = textOnlyColumn 

      ts = Now().Subtract(t1) 
      addText(TextLog, "Execution time in " + ts.TotalMilliseconds.ToString() + " msec.") 
      t1 = Now() 

      Application.DoEvents() 
     End If 
    Next 

    WriteIntoFile(fileName, text) 

問題がある:すべての反復が前のよりも遅くなります。 300行ごとに、この時間は約50msecになります(この写真のように)。

Echo every 300 rows

なぜですか?
診断セッションのメモリは成長しません

+0

文字列は不変です。したがって、現在の文字列を連結しているため、ループが遅くても300回再作成する必要があります。コレクションを使用すると、いくつかの方法が高速になりますが、なぜそれらをキャッシュするのでしょうか?各行を書式設定しながらストリームに書き出します。 [ask]を読んで[ツアー] – Plutonix

+0

を読んでください。メモでは、StringBuilderを使用するとわずかな向上が得られます。 – N0Alias

答えて

0

コメント文字列は不変であり、各連結は新しい文字列を作成します。文字列がメモリに多く存在するほど、処理は遅くなります。 したがって、文字列処理は完全に避けなければなりません。

For x As Integer = 0 To dtRows 
     'set row values' 
     For y As Integer = 0 To dtColumns 
      WriteIntoFile(fileName,dt(x)(y)) 
      If (y <> dtColumns) Then 
       WriteIntoFile(fileName,";") 
      Else 
       WriteIntoFile(fileName, vbCrLf) 
      End If 
     Next 

     If (x Mod 300 = 0 And x <> 0) Then 

      WriteIntoFile(fileName,textOnlyColumn) 

      ts = Now().Subtract(t1) 
      addText(TextLog, "Execution time in " + ts.TotalMilliseconds.ToString() + " msec.") 
      t1 = Now() 

      Application.DoEvents() 
     End If 
    Next 

ちょうどあなたが

GC.Collect 
GC.WaitForPendingFinalizers 

mod 300枝に)含めるようにしようとすると、それがパフォーマンスにどのように影響するか見ることができるの目的を研究するため。

関連する問題