共计 1807 个字符,预计需要花费 5 分钟才能阅读完成。
这期内容当中丸趣 TV 小编将会给大家带来有关 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
上述就是丸趣 TV 小编为大家分享的 IIS 日志导入 SQLSERVER 的实例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。