【发布时间】:2010-01-04 19:44:54
【问题描述】:
我正在开发一个日志解析器,并且我正在读取超过 150MB 的字符串文件。- 这是我的方法,有什么方法可以优化 While 语句中的内容吗?问题是这会消耗大量内存。-我还尝试使用面临相同内存消耗的字符串生成器。-
private void ReadLogInThread()
{
string lineOfLog = string.Empty;
try
{
StreamReader logFile = new StreamReader(myLog.logFileLocation);
InformationUnit infoUnit = new InformationUnit();
infoUnit.LogCompleteSize = myLog.logFileSize;
while ((lineOfLog = logFile.ReadLine()) != null)
{
myLog.transformedLog.Add(lineOfLog); //list<string>
myLog.logNumberLines++;
infoUnit.CurrentNumberOfLine = myLog.logNumberLines;
infoUnit.CurrentLine = lineOfLog;
infoUnit.CurrentSizeRead += lineOfLog.Length;
if (onLineRead != null)
onLineRead(infoUnit);
}
}
catch { throw; }
}
提前致谢!
额外: 我保存每一行,因为在阅读日志后,我需要检查每一行存储的一些信息。- 语言是 C#
【问题讨论】:
-
保留每一行的原因是什么?内存配置文件显示为最昂贵的一个或多个对象?你想要的内存阈值是多少?
-
你用了多少内存,你觉得合理吗?
-
我在使用 300MB 内存时停止了进程,尽管我什至不在文件中间 :(
-
您实际上是将整个文件加载到内存中,并在此过程中增加了开销。 .NET 以 UTF16 将字符串存储在内存中(每个字符使用 2 个字节),而您的文本文件几乎可以肯定使用 1 字节编码。这立即转化为使用的内存量与磁盘大小相比翻了一番。最重要的是,您用于存储数据的跟踪结构中会有一些开销,列表必须维护对每个字符串的引用,并且每个字符串都有一个与之关联的 clr 对象头。
标签: c# string memory-management algorithm