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

标签 c# .net winforms visual-studio-2010 list

我有一个 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/

相关文章:

c# - 无法创建 Google.Apis.Services.BaseClientService 的实例

c# - .Net 观察者模式改变。这些是什么时候发生的,为什么?

c# - 当我使用 using 对象时,我应该在退出 using block 之前处理该对象吗?

wpf - 智能客户端Winform vs MVVM + Prism

c# - 当 DialogResult 为 No 时防止 Form 关闭

c# - Blazor 将输入值绑定(bind)到 oninput 不适用于 onkeypress

c# - 如何从 ASP.NET MVC 3 设置 HTTP 状态代码?

c# - xml 中的 DataContract/DataMember 多个元素

c# - 检测窗体何时关闭 C#

c# - HTML 生成的字符串未显示为 HTML