您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)IIS日志導(dǎo)入SQLSERVER的實(shí)例分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一直使用URCHIN分析日志,這款google的日志分析工具無論從功能或效率都沒的說。
但還是有些特殊的分析需求還是不能完成。因此決定把日志導(dǎo)入到SQLSERVER中進(jìn)行分析
開始想象的比較簡單。嵌套一個循環(huán)基本可以完成
一個大循環(huán)讀取某文件夾下的所有日志文件
里邊的小循環(huán)逐行讀取日志,里邊split開來,插入sql即可。
根據(jù)數(shù)據(jù)表建立tableadapter ,使用insert存儲過程逐條插入數(shù)據(jù)。
第一個問題來了,發(fā)現(xiàn)一個日志文件大約200W行需要執(zhí)行3個小時!?。?/p>
效率太低了,開始考慮開啟多線程,后來發(fā)現(xiàn)執(zhí)行效率應(yīng)該和線程無關(guān),主要在tableadapter的插入操作上。
這個插入方法實(shí)際上是每次執(zhí)行連接-插入-斷開操作。
解決方法是使用內(nèi)存,少進(jìn)行IO操作。
先建立一個datatable。使用tableadapter中的強(qiáng)類型對象初始化這個datatable。
然后將數(shù)據(jù)讀入datatable.
最后使用.net對象中的sqkbulkcopy 填充數(shù)據(jù)庫。
這樣數(shù)據(jù)填充的速度問題解決了。幾乎200W的數(shù)據(jù)在5分鐘之內(nèi)可以導(dǎo)完。
但實(shí)際調(diào)試中,第二個問題來了。(一直也沒弄明白)
我使用的服務(wù)器是2003 64位系統(tǒng)內(nèi)存16G。
一個數(shù)據(jù)文件大概500M,每次填充datatable的時候,一個文件沒導(dǎo)完就會報outofmemory的錯誤,內(nèi)存溢出了!!
很奇怪,按說64位的系統(tǒng)應(yīng)該可以管理很多內(nèi)存,不存在32為的AWE的問題。
于是繼續(xù)嘗試在循環(huán)內(nèi)建立小循環(huán),每次導(dǎo)入datatable 100W 條數(shù)據(jù)。
導(dǎo)入第一批100W成功了,可循環(huán)到第二個100W的時候還是同樣的錯誤。
看代碼,每次導(dǎo)入完成之后,我使用table.dispose()清理,可觀察資源管理器,內(nèi)存并沒有釋放掉。
于是使用table.rows.clear()
或者使用table.clear()??
+ GC.collect()
這樣基本可以解決內(nèi)存無法釋放的問題,但在實(shí)際使用中還是發(fā)現(xiàn)內(nèi)存一直在漲,因?yàn)閟qlbulkcopy時候sqlserver也會占用很多內(nèi)存。
少量日志導(dǎo)入應(yīng)該不會有問題,但不知道連續(xù)導(dǎo)入時會出現(xiàn)什么樣的情況
主要代碼
Private Sub readLogfile(ByVal log As FileInfo)
Dim reader As StreamReader = New StreamReader(log.FullName)
While Not reader.EndOfStream
For j As Int32 = 0 To 1000000
If Not reader.EndOfStream Then
handleLine(reader.ReadLine())
i += 1
Console.WriteLine(j)
Else
Exit While
End If
Next
bulkcopy(table1)
'table1.Rows.Clear()
table1.Clear()
GC.Collect()
Console.WriteLine("---------------------------------------------" & i)
End While
Private Sub bulkcopy(ByVal newtable As DataTable)
Using sqlbulk As SqlBulkCopy = New SqlBulkCopy(Configuration.ConfigurationManager.ConnectionStrings("logAnalysis.My.MySettings.logDBConnectionString").ConnectionString)
sqlbulk.DestinationTableName = "logDB .dbo.Table_1"
sqlbulk.BulkCopyTimeout = 108000
sqlbulk.WriteToServer(newtable)
sqlbulk.Close()
End Using
End Sub
上述就是小編為大家分享的IIS日志導(dǎo)入SQLSERVER的實(shí)例分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。