Использование XML Сериализация
Создание классов для представления вашего файла
Imports System.IO
Imports System.Xml.Serialization
<XmlRoot("PROJECTS")>
Public Class Projects
<XmlElement("row")>
Public Property Rows As List(Of Row)
End Class
Public Class Row
<XmlElement("APPLICATION_ID")>
Public Property Application_ID As Integer
<XmlElement("ACTIVITY")>
Public Property Activity As String
<XmlElement("ADMINISTERING_IC")>
Public Property Administering_IC As String
End Class
(я написал некоторый код для создания файла 1 миллиона <row>
XML, который составляет ~ 140 МБ.)
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim sw As New Stopwatch()
sw.Start()
Await Task.Factory.StartNew(AddressOf writeProjects)
sw.Stop()
Console.WriteLine($"Created file in {sw.ElapsedMilliseconds} ms.")
End Sub
Private Sub writeProjects()
Dim p As New Projects()
p.Rows = New List(Of Row)()
For i = 1 To 1000000
Dim r As New Row With {
.Application_ID = i,
.Activity = $"R0{i}",
.Administering_IC = "CA"
}
p.Rows.Add(r)
Next
Using writer As New StreamWriter("filename.xml")
Dim s As New XmlSerializer(GetType(Projects))
s.Serialize(writer, p)
End Using
End Sub
Создан файл за 2346 мс.
И используйте этот код для чтения файла и записи в базу данных
Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim sw As New Stopwatch()
sw.Start()
Dim p = Await Task.Factory.StartNew(AddressOf readProjects)
sw.Stop()
Console.WriteLine($"Read file in {sw.ElapsedMilliseconds} ms.")
sw.Restart()
Await Task.Factory.StartNew(AddressOf writeSQL, p, TaskCreationOptions.None)
sw.Stop()
Console.WriteLine($"Wrote to SQL in {sw.ElapsedMilliseconds} ms.")
End Sub
Private Function readProjects() As Projects
Dim p As Projects
Using reader As New StreamReader("filename.xml")
Dim s As New XmlSerializer(GetType(Projects))
p = DirectCast(s.Deserialize(reader), Projects)
End Using
Return p
End Function
Private Sub writeSQL(o As Object)
Dim p = DirectCast(o, Projects)
For Each r In p.Rows
' insert each row
Dim q =
$"INSERT INTO [Table] (APPLICATION_ID, ACTIVITY, ADMINISTERING_IC)
VALUES ({r.Application_ID}, '{r.Activity}', '{r.Administering_IC}')"
Next
' or SQL bulk insert
End Sub
Считать файл за 3442 мс.
Записать в SQL за 625 мс.
В строке For Each r In p.Rows
у вас есть реальные объекты в памяти со свойствами, такими как Application_ID
, Activity
и Administering_IC
. Они вставляются легко индивидуально, что может занять некоторое время. Или вы можете сделать SQL массовую вставку. Получение объектов из файла в команды SQL INSERT занимает менее 5 секунд для 1 миллиона строк.