【发布时间】:2014-01-27 09:25:47
【问题描述】:
我有一个 C# winforms 应用程序,其中我使用 OpenFileDialog 让用户选择要打开的文本文件。(允许多选) 一旦他们选择了文本文件,我就会一个一个地打开文件,获取文本并将内容存储在 List 变量中,方法是使用 List.Add() 操作。
当用户选择异常大量的文本文件时出现我的问题,例如 1264 个文本文件,总大小高达 750MB,程序无法处理。它最多读取大约 850 个文件,然后给我一个内存不足的异常。 在任务管理器中,发生这种情况时,我的应用程序的内存(私有工作集)约为 1.5GB。 我使用具有 32GB 内存的 x64 机器。
我给出了读取文件的代码:
public static List<LoadData> LoadDataFromFile(string[] filenames)
{
List<LoadData> MasterData = new List<LoadData>();
lookingForJobs = new LookingForJobs(1,filenames.Length);
lookingForJobs.Show();
/*-------OUTER LOOP TO GO THROUGH ALL THE FILES-------*/
for (int index = 0; index < filenames.Length; index++)
{
string path = filenames[index];
/*----------INNER LOOP TO GO THROUGH THE CONTENTS OF EACH FILE------*/
foreach (string line in File.ReadAllLines(path))
{
string[] columns = line.Split('\t');
if (columns.Length == 9)
{
if (line.StartsWith("<")) /*-------IGNORING THE FIRST 8 LINES OF EACH LOG FILE CONTAINING THE LOGGER INFO---------*/
{
MasterData.Add(new LoadData
{
Event_Type = columns[0],
Timestamp = columns[1],
Log_Message = columns[2],
Category = columns[3],
User = columns[4],
Thread_ID = columns[5],
Error_Code = columns[6],
Application = columns[7],
Machine = columns[8]
});
}
}
}
lookingForJobs.SearchingForJobsProgress.PerformStep();
/*--------END OF INNER LOOP--------*/
}
lookingForJobs.Dispose();
/*-----------END OF OUTER LOOP-----*/
return MasterData;
}
编辑: 我知道我可能应该重新设计我的代码,以便不会一次将所有文件读入对象。但是,我想知道列表对象或内存(私有工作集)的大小是否有任何限制。我在几篇文章中读到,有时当您达到 1.5-1.6 GB 时,就会出现这类问题。
【问题讨论】:
-
您是在 x64 模式下构建应用程序吗?
-
@Guffa 添加内存直到它爆裂不是必要正确的“修复”这里,特别是当流式(而不是缓冲)方法如此微不足道时(见康拉德的回答)
-
你确定你需要内存中的所有数据吗?
-
@MarcGravell:由于处理完每个文件后数据都会被丢弃,我无法想象它会产生如此大的差异。
-
@Simon,是的,也许我可以采用一种在处理后删除一些数据的方法。我的 MasterData 列表大小达到 ~2564543 个元素。这里有限制吗?
标签: c# .net winforms visual-studio-2010 list