溫馨提示×

溫馨提示×

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

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

IIS日志導入SQLSERVER的實例分析

發布時間:2021-11-30 16:39:17 來源:億速云 閱讀:190 作者:柒染 欄目:數據庫

這期內容當中小編將會給大家帶來有關IIS日志導入SQLSERVER的實例分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一直使用URCHIN分析日志,這款google的日志分析工具無論從功能或效率都沒的說。

但還是有些特殊的分析需求還是不能完成。因此決定把日志導入到SQLSERVER中進行分析

開始想象的比較簡單。嵌套一個循環基本可以完成

一個大循環讀取某文件夾下的所有日志文件

里邊的小循環逐行讀取日志,里邊split開來,插入sql即可。

根據數據表建立tableadapter ,使用insert存儲過程逐條插入數據。

第一個問題來了,發現一個日志文件大約200W行需要執行3個小時?。?!

效率太低了,開始考慮開啟多線程,后來發現執行效率應該和線程無關,主要在tableadapter的插入操作上。

這個插入方法實際上是每次執行連接-插入-斷開操作。

解決方法是使用內存,少進行IO操作。

先建立一個datatable。使用tableadapter中的強類型對象初始化這個datatable。

然后將數據讀入datatable.

最后使用.net對象中的sqkbulkcopy 填充數據庫。

這樣數據填充的速度問題解決了。幾乎200W的數據在5分鐘之內可以導完。

但實際調試中,第二個問題來了。(一直也沒弄明白)

我使用的服務器是2003 64位系統內存16G。

一個數據文件大概500M,每次填充datatable的時候,一個文件沒導完就會報outofmemory的錯誤,內存溢出了??!

很奇怪,按說64位的系統應該可以管理很多內存,不存在32為的AWE的問題。

于是繼續嘗試在循環內建立小循環,每次導入datatable 100W 條數據。

導入第一批100W成功了,可循環到第二個100W的時候還是同樣的錯誤。

看代碼,每次導入完成之后,我使用table.dispose()清理,可觀察資源管理器,內存并沒有釋放掉。

于是使用table.rows.clear()

或者使用table.clear()??

+ GC.collect()

這樣基本可以解決內存無法釋放的問題,但在實際使用中還是發現內存一直在漲,因為sqlbulkcopy時候sqlserver也會占用很多內存。

少量日志導入應該不會有問題,但不知道連續導入時會出現什么樣的情況

主要代碼

 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日志導入SQLSERVER的實例分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女