溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

IIS日志導(dǎo)入SQLSERVER的實(shí)例分析

發(fā)布時間:2021-11-30 16:39:17 來源:億速云 閱讀:180 作者:柒染 欄目:數(shù)據(jù)庫

這期內(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI