我已经创建了一个日志解析器,用于解析包含大量行的日志文件。当前实现使用LinkedList<T>
来构建条目列表并且非常快。
我还构建了一个使用虚拟列表视图的日志查看器。正如您可能理解的那样,链接列表不能很好地工作。
我正在考虑在进行初始解析时使用LinkedList
,然后在完成时分配List
(指定容量)。然后我只需使用AddRange
将日志条目添加到列表中。
由于我在日志文件中使用FileSystemWatcher
,因此稍后会添加更多新项目,但与初始解析的速率不同。
切换是否是一个好主意,或者你有更好的建议吗?
解析由实现以下接口的东西完成(每个日志格式一个解析器)。
Public Interface ILogParser
Sub Parse(ByVal stream As IO.Stream)
Sub Parse(ByVal stream As IO.Stream, ByVal offset As Long)
Event EntryParsed(ByVal sender As Object, ByVal e As ParsedEntryEventArgs)
Event Completed(ByVal sender As Object, ByVal e As EventArgs)
End Interface
logviewer订阅这两个事件,并将EntryParsed
事件中的每个条目添加到LinkedList
。解析整个日志(文件)流时会触发Completed
事件。
完成后,我开始跟踪成功解析的流中的最后一个位置,并在每次触发Parse(fileStream, lastPosition)
事件时调用日志解析器方法FileSystemWatcher
。
答案 0 :(得分:1)
我写了很多解析器,我使用List&lt;&gt;而不是LinkedList,我通常做的是我在开始解析之前猜测List的大小(你经常可以从文件的大小或行数中猜出你的List需要多大)。
话虽如此,如果使用List让你的系统有很多OurOfMemory execptions,我会交换到LinkedList&lt;&gt;。
旁注,当我说很多行时我的意思是200k +
答案 1 :(得分:0)
LinkedList在此处不提供任何好处,因为您没有“删除”或“插入”日志条目的任何要求。如果日志是tiemstamp base,那么这些将被“追加”。
答案 2 :(得分:0)
我第一次解析日志文件时,已从List<T>
切换到LinkedList<T>
。第一次解析完成后,我将所有内容复制到List<T>
,以便能够在我的虚拟列表视图中使用它。
解决方案效果很好,性能提升优先;)