每个数据表行迭代都比前一个迭代慢

时间:2017-11-10 18:42:37

标签: vb.net sqlite datatables

我在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行,时间就会增加约50毫秒(正如你在这张照片中看到的那样)。

Echo every 300 rows

为什么?
诊断会话中的记忆不会增长

1 个答案:

答案 0 :(得分: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

注意

仅出于学习目的,您可以尝试包含(到mod 300分支)

GC.Collect
GC.WaitForPendingFinalizers 

并了解它如何影响效果。