【发布时间】:2012-01-04 19:47:32
【问题描述】:
我正忙于一个应用程序,它读取大小从 5mb 到 1gb+ 的空间分隔日志文件,然后将此信息存储到 MySQL 数据库中,以供以后根据文件中包含的信息打印报告时使用。我尝试过/发现的方法有效,但速度很慢。
我做错了吗?还是有更好的方法来处理非常大的文本文件?
我尝试过如下使用 textfieldparser:
Using parser As New TextFieldParser("C:\logfiles\testfile.txt")
parser.TextFieldType = FieldType.Delimited
parser.CommentTokens = New String() {"#"}
parser.Delimiters = New String() {" "}
parser.HasFieldsEnclosedInQuotes = False
parser.TrimWhiteSpace = True
While Not parser.EndOfData
Dim input As String() = parser.ReadFields()
If input.Length = 10 Then
'add this to a datatable
End If
End While
End Using
这可行,但对于较大的文件来说非常慢。
然后我尝试根据以下函数使用与文本文件的 OleDB 连接以及我事先写入目录的 schema.ini 文件:
Function GetSquidData(ByVal logfile_path As String) As System.Data.DataTable
Dim myData As New DataSet
Dim strFilePath As String = ""
If logfile_path.EndsWith("\") Then
strFilePath = logfile_path
Else
strFilePath = logfile_path & "\"
End If
Dim mySelectQry As String = "SELECT * FROM testfile.txt WHERE Client_IP <> """""
Dim myConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFilePath & ";Extended Properties=""text;HDR=NO;""")
Dim dsCmd As New System.Data.OleDb.OleDbDataAdapter(mySelectQry, myConnection)
dsCmd.Fill(myData, "logdata")
If Not myConnection.State = ConnectionState.Closed Then
myConnection.Close()
End If
Return myData.Tables("logdata")
End Function
schema.ini 文件:
[testfile.txt]
Format=Delimited( )
ColNameHeader=False
Col1=Timestamp text
Col2=Elapsed text
Col3=Client_IP text
Col4=Action_Code text
Col5=Size double
Col6=Method text
Col7=URI text
Col8=Ident text
Col9=Hierarchy_From text
Col10=Content text
有人知道如何更快地读取这些文件吗?
-编辑- 更正了上面代码中的一个错字
【问题讨论】:
-
您可能会考虑使用logparser,而不是尝试自己实现它。
-
这些方法是否一次读取整个文件?如果您查看程序的内存,它是否会超过您正在读取的文件的大小(500MB-1GB)?如果是这样,您可能需要使用一种读取文件的方法,该方法可以一次读取一行文件。
-
@AakashM 谢谢肯定会调查的。
标签: mysql vb.net visual-studio-2010 data-import