我在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
为什么?
诊断会话中的记忆不会增长。
答案 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
并了解它如何影响效果。