【发布时间】:2013-01-02 03:36:38
【问题描述】:
我正在寻找一种分析自定义日志文件的方法。
我现在已经使用 LINQ 和 C#.NET 实现了。它仅适用于最大 500MB 的日志文件。
日志文件的每一行都被制成一个看起来像
的对象public class Metrics
{
public DateTime Date { get; set; }
public string Metrics1 { get; set; }
public string Metrics2 { get; set; }
:
:
public string Metrics9 { get; set; }
}
List<Metrics> MetricsList = new List<Metrics>();
MetricsList 已填充。 在 MetricsList 上运行各种 LINQ 查询以提供有用的分析。 据观察,一个 Metrics 对象需要 300 个字节。我在 500MB 的日志文件中有大约 400 万行,这使得仅 MetricsList 的大小就消耗了超过 1GB 的程序内存。
我的要求是解析和分析最大 2 GB 的文件,这看起来会消耗 4 GB 的内存。
使用 Windows、Microsoft 技术和任何开源库的任何更好的方法或替代方案。
【问题讨论】:
-
您可能需要将数据流式传输。一次读取一个指标(或一大块指标),将它们从内存中丢弃,然后移至下一个。
-
你读的怎么样?您可以使用
Streamreader或File.ReadLines逐行读取一行而不是全部读取(例如File.ReadAllLines)。您还应该看看MemoryMappedFile-class。 内存映射文件使程序员能够处理非常大的文件,因为内存可以同时管理,并且它们允许对文件进行完全、随机的访问,而无需查找。内存映射文件也可以跨多个进程共享> -
“我在使用 Windows 和 Microsoft 技术方面存在限制”,您为什么认为这是限制?您还有哪些其他技术?
-
@Tim 我的意思是为什么张贴者认为 Window 和 Microsoft 技术是有限的。他认为还有哪些其他技术可以不受限制地做到这一点。我想你误解了我的评论!
-
LINQ 只停留在 500MB?您是否在指标中有重复值?如果是这样,请创建一个 Dictionary
并在 List 中存储 int。
标签: c# .net performance memory scalability