gpt4 book ai didi

c# - 在 C# 中处理大文件时出现内存不足异常

转载 作者:行者123 更新时间:2023-11-30 19:01:49 25 4
gpt4 key购买 nike

我有一个 C# winforms 应用程序,其中我使用 OpenFileDialog 让用户选择要打开的文本文件。(允许多选)一旦他们选择了文本文件,我就一个一个打开文件,获取文本并使用 List.Add() 操作将内容存储在一个 List 变量中。

当用户选择异常大量的文本文件(例如总大小高达 750MB 的 1264 文本文件)时,我的问题就出现了,程序无法处理它。它最多读取大约 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;
}

编辑:我知道我可能应该重新设计我的代码,以便不是所有文件都一次读入对象。但是,我想知道列表对象或内存(私有(private)工作集)的大小是否有任何限制。我在几篇文章中读到,当您达到 1.5-1.6 GB 时,有时会出现这些问题。

最佳答案

使用 File.ReadLines 而不是 File.ReadAllLines 因为第二个是不必要地将所有文件加载到内存中,而您一次只需要一行。 MSDN says :

When you use ReadAllLines, you must wait for the whole array of strings be returned before you can access the array. Therefore, when you are working with very large files, ReadLines can be more efficient.

这可能会给您带来相当大的内存力提升。

第二个想法是重新考虑是否真的需要在内存中存储如此大的数据。也许您可以只存储每个文件的文件路径并在需要时读取它们。

关于c# - 在 C# 中处理大文件时出现内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21377133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com