归档日志文件时内存不足错误

2023-12-24

我在运行控制台作业时遇到问题,该作业运行并创建我在午夜存档的每日日志文件。

这将创建一个第二天的空白日志文件和一个存档文件,其中名称中包含昨天的日期以及旧文件的内容,用于调试我可能遇到但直到第二天才知道的问题。

然而,自从我启动 BOT 的工作以来,当我尝试归档文件时,我一直遇到系统内存不足错误的问题。

起初我根本无法获取存档文件,然后我找到了一种方法来获取至少最后 100,000 行,但这还远远不够。

我将所有内容包装在 3 个 try/catch 中

  1. I/O
  2. 系统内存不足
  3. 标准例外

然而,我得到的总是 OutOfMemoryException,例如

System.OutOfMemoryException 错误:抛出了“System.OutOfMemoryException”类型的异常。

举个例子,大小为 100,000 行的日志大约为 11MB 文件

标准完整日志文件可以是 1/2 GB 到 2GB 之间的任何内容

我需要知道的是:

a) 当尝试使用 File.ReadAllText 或我称为 ReadFileString 的自定义 StreamReader 函数时,标准文本文件的大小会引发内存不足错误,例如

public static string ReadFileString(string path)
{
    // Use StreamReader to consume the entire text file.
using (StreamReader reader = new StreamReader(path))
{
    return reader.ReadToEnd();
    }
}

b) 是我的计算机内存(我有 16GB RAM - 复制时使用了 8GB)还是我在 C# 中使用的对象在打开和复制文件时失败了。

归档时,我首先尝试使用自定义 ReadFileString 函数(见上文),如果返回 0 字节的内容,我会尝试 File.ReadAllText,然后如果失败,我会尝试自定义函数来获取最后 100,000 行,这对于当天早些时候调试错误。

日志文件在创建新日志文件时于午夜开始并记录一整天。我以前从未遇到过内存不足错误,但由于我调高了方法调用的频率,日志记录已扩展,这意味着文件大小也已扩展。

这是我的自定义函数,用于获取最后 100,000 行。我想知道在 IT 不会抛出内存不足错误的情况下我可以获得多少行,并且我根本没有获得最近几天日志文件的任何内容。

人们对保存 X 行所需的各种方法/内存的最大文件大小有何建议,以及获取尽可能多的日志文件的最佳方法是什么?

例如,某种方式逐行循环,直到遇到异常,然后保存我所拥有的内容。

这是我的 GetHundredThousandLines 方法,它记录到一个非常小的调试文件,这样我就可以看到存档过程中发生了什么错误。

private bool GetHundredThousandLines(string logpath, string archivepath)
{
    bool success = false;

    int numberOfLines = 100000;


    if (!File.Exists(logpath))
    {
    this.LogDebug("GetHundredThousandLines - Cannot find path " + logpath + " to archive " + numberOfLines.ToString() + " lines");
    return false;
    }

    var queue = new Queue<string>(numberOfLines);

    using (FileStream fs = File.Open(logpath, FileMode.Open, FileAccess.Read, FileShare.Read))
    using (BufferedStream bs = new BufferedStream(fs))  // May not make much difference.
    using (StreamReader sr = new StreamReader(bs))
    {
    while (!sr.EndOfStream)
    {
        if (queue.Count == numberOfLines)
        {
        queue.Dequeue();
        }

        queue.Enqueue(sr.ReadLine() + "\r\n");
    }
    }

    // The queue now has our set of lines. So print to console, save to another file, etc.
    try
    {

    do
    {        
        File.AppendAllText(archivepath, queue.Dequeue(), Encoding.UTF8);
    } while (queue.Count > 0);


    }
    catch (IOException exception)
    {
    this.LogDebug("GetHundredThousandLines - I/O Error accessing daily log file with ReadFileString: " + exception.Message.ToString());
    }
    catch (System.OutOfMemoryException exception)
    {
    this.LogDebug("GetHundredThousandLines - Out of Memory Error accessing daily log file with ReadFileString: " + exception.Message.ToString());
    }
    catch (Exception exception)
    {
    this.LogDebug("GetHundredThousandLines - Exception accessing daily log file with ReadFileString: " + exception.Message.ToString());
    }


    if (File.Exists(archivepath))
    {
    this.LogDebug("GetHundredThousandLines - Log file exists at " + archivepath);
    success = true;
    }
    else
    {
    this.LogDebug("GetHundredThousandLines - Log file DOES NOT exist at " + archivepath);
    }

    return success;

}

任何帮助将非常感激。

Thanks


尝试: 将队列和流位置保留在类范围内,在出现内存不足异常时尝试 GC.Collect() 并再次调用函数。寻找流到最后一个位置并继续。 或者: 使用像sqlite这样的单一数据库,并在每个表中保留最新的100000条记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

归档日志文件时内存不足错误 的相关文章

  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • Task.Run 作为反模式?

    我正在将 SQLite NET PCL 库用于我的 WinRT 项目SQliteAsyncConnection类 它提供经典的异步版本SQLiteConnection方法 然而 就该项目而言Github页面 https github com
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • SecurityAction.RequestMinimum 在 .Net 4.0 中已过时

    最近 我们的 Net 客户端库正在升级以针对 Net 4 0 进行编译 将目标框架更改为4 0后 应用程序出现一些编译错误 In AssemblyInfo cs assembly SecurityPermission SecurityAct
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 为什么 0.5 mod 0.1 在不同的编程语言中结果不同?

    我有一个关于模数的问题 模运算求一个数除以另一个数的余数 我原本期望 0 5 0 1 0 的结果 但是当我在 PHP 或 net 中运行它时 我得到 0 1 我运行的 php 代码是 var dump fmod 0 5 0 1 在 net中
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • ElasticSearch PutMapping API:MapperParsingException 解析后根类型映射不为空

    我的本地实例上有一个 River ES 1 3 4 和 JDBC For MySql 1 3 4 4 这条河运行良好 并在 ES 中导入数据 我面临的问题是我的字段之一是文本字段并且其中有空格 例如 实时计算器 ES 将其索引为 实时 时间
  • 如何在不使用 IDE 且不了解程序流程的情况下调试应用程序?

    我正在尝试修改优秀书籍提供的朴素贝叶斯分类器的代码集体智慧编程 https rads stackoverflow com amzn click com 0596529325 使其适应 GAE 数据存储 提供的代码使用 pysqlite2 但
  • django 1.3+ 的简单日志到文件示例

    发行说明说 Django 1 3 添加了框架级别 支持 Python 的日志记录模块 那很好 我想利用这一点 很遗憾文档 http docs djangoproject com en 1 11 topics logging 并没有以完整的工
  • 将图标放置在 div 的右上角

    我创建了这段代码 但我无法将图标放在 valori 类的 div 的右上角 这里是期望的结果 这里的代码 HTML div class circletop div class numberpr 3 anno div div class lo
  • 运行 Firebase 模拟器时出现“确定执行环境时出现意外错误”

    当我部署函数时 一切正常 但使用 Firebase 模拟器在本地运行相同的代码会出现以下错误 message Unexpected error determining execution environment request to htt
  • 表单提交复选框将值设置为“on”而不是“true”

    您好 我有一个 html 表单 我通过按钮上的单击事件提交该表单 该事件触发 myform submit 问题是表单上有一个复选框 并且在发布的参数下的 firebug 中它显示 mycheckbox1 on 而不是预期的 mycheckb
  • 在嵌套元组中查找值

    假设我有 t dog Dog cat Cat fish Fish 我需要检查一个值是否位于嵌套元组的第一位 即小写位 中 我怎样才能做到这一点 大写值实际上并不重要 我只想搜索仅包含小写值的字符串 if fish in t print Fi
  • jspdf AutoTable :表格特定行的目标样式

    我正在为我的表格 pdf 使用 jsPDF AutoTable 插件 我的资料来源 javaScriptIncludeTag jspdf min js javaScriptIncludeTag jspdf plugin autotable
  • 类 CharField() 的参数

    有什么区别CharField name max length 100 and CharField max length 100 参数是什么 name 用于 什么是CharField 构造函数 有人可以给我一个链接吗 CharField 继承
  • 保持geom_rect半透明区域,但彩色轮廓

    我正在尝试使用 R 中的plotly 创建一个带有矩形的交互式绘图 我的主要想法正在发挥作用 然而 我所坚持的是允许每个矩形都有一个彩色轮廓 如数据的 填充 列中所描绘的 但是是一个完全透明的区域 以下是正在运行的 MWE library
  • 收款人不接受以该货币付款

    我正在尝试执行链式付款 其中主要收款人采用英镑 GBP 货币 我是交易的第二接收者 我的帐户设置为美元 但不阻止任何货币 如您所见 以下是确切的错误消息 接收方 不接受此货币的付款 请帮助我理解为什么会失败 我的帐户需要进行其他设置吗 我必
  • 如何找到 CUDA 的 epsilon、min 和 max 常量?

    我正在寻找 CUDA 设备的 epsilon 两个数字之间的最小步长 min 最小量值 和 max 最大量值 的值 即 FLT EPSILON DBL EPSILON FLT MIN DBL MIN 和 FLT MAX DBL MAX 中定
  • GOlang Scanf 错误

    当使用 Scanf 两次时 第一次它会获取用户输入 但第二次它不会并从函数中返回 这只是在 Windows 上运行时才会出现的问题 当我在 Mac 上运行它时 它会按预期工作 首先询问用户的用户名 然后询问他们的密码 下面是问题中的代码 我
  • Swift 可选的 inout 参数和 nil

    是否有可能有一个Optional inoutSwift 中函数的参数 我正在尝试这样做 func testFunc inout optionalParam MyClass if optionalParam 但是当我尝试调用它并通过时nil
  • swi prolog 中的优化

    假设我想找到 argmax x y z 1 2 20x 2 32xy 16y 2 2x 2y 受 x gt 0 y gt 0 z gt 0 且 x y z 0 我知道偏导数设置为 0 是 20x 16y 2 0 和 16x 16y 2 0
  • onCreate 方法内的屏幕截图在 android 中不起作用

    我正在一个 Android 应用程序中工作 我想在重写的方法 onCreate 中捕获当前活动的屏幕 当我在重写的方法 onCreate 中编写用于捕获屏幕的代码时 位图返回 null 但是 当我在同一活动中单击按钮中调用相同的代码时 位图
  • 在Container中挂载目录并与Host共享

    我以为我理解了文档 但也许我没有 我的印象是 v HOST PATH CONTAINER PATH标志是双向的 如果容器中有文件或目录 它们将被镜像到主机上 这使我们即使在删除 docker 容器后也能保留目录和文件 在官方 MySQL d
  • statsmodels wls_prediction_std 的数学背景

    wls prediction std 返回拟合模型数据的标准差和置信区间 我需要知道如何从协方差矩阵计算置信区间 我已经尝试通过查看源代码来解决这个问题 但没能做到 我希望你们中的一些人可以通过写出 wls prediction std 背
  • Android 在 addTextChangedListener (edittext) 中的某些条件下禁用肯定按钮

    这是我的对话框代码 如果编辑文本中的文本大小大于 5 我想禁用肯定按钮 如果大小 private void myDialog String title AlertDialog Builder builder new AlertDialog
  • 归档日志文件时内存不足错误

    我在运行控制台作业时遇到问题 该作业运行并创建我在午夜存档的每日日志文件 这将创建一个第二天的空白日志文件和一个存档文件 其中名称中包含昨天的日期以及旧文件的内容 用于调试我可能遇到但直到第二天才知道的问题 然而 自从我启动 BOT 的工作