读取非常大的文本文件,我应该合并异步吗?

2024-01-08

我面临的挑战是创建一种方法,将非常大的文本文件读入程序中,这些文件的大小范围从 2GB 到 100GB。

到目前为止,我们的想法是将 1000 行文本读入该方法。

目前,程序是使用流读取器逐行读取文件并处理该行上找到的必要数据区域来设置的。

using (StreamReader reader = new StreamReader("FileName"))
{
    string nextline = reader.ReadLine();
    string textline = null;

    while (nextline != null)
    {
        textline = nextline;
        Row rw = new Row();
        var property = from matchID in xmldata
                       from matching in matchID.MyProperty
                       where matchID.ID == textline.Substring(0, 3).TrimEnd()
                       select matching;

        string IDD = textline.Substring(0, 3).TrimEnd();

        foreach (var field in property)
        {
            Field fl = new Field();

            fl.Name = field.name;
            fl.Data = textline.Substring(field.startByte - 1, field.length).TrimEnd();
            fl.Order = order;
            fl.Show = true;

            order++;

            rw.ID = IDD;
            rw.AddField(fl);
        }
        rec.Rows.Add(rw);
        nextline = reader.ReadLine();

        if ((nextline == null) || (NewPack == nextline.Substring(0, 3).TrimEnd()))
        {
            d.ID = IDs.ToString();
            d.Records.Add(rec);
            IDs++;
            DataList.Add(d.ID, d);
            rec = new Record();

            d = new Data();
        }
    }
}

该程序继续进行并填充一个类。 (刚刚决定不发布其余部分)

我知道一旦程序显示一个非常大的文件,就会出现内存异常错误。

这就是我当前的问题,到目前为止,我一直在谷歌上搜索几种方法,很多人只是回答使用流阅读器和 reader.readtoend,我知道 readtoend 对我不起作用,因为我会遇到这些内存错误。

最后,我一直在研究异步作为创建一种方法的方法,该方法将读取一定数量的行并在处理下一批行之前等待调用。

这让我想到了我的问题,我正在努力理解异步,而且我似乎找不到任何可以帮助我学习的材料,并且希望这里有人可以帮助我找到理解异步的方法。

当然,如果有人知道解决这个问题的更好方法,我会洗耳恭听。

EDIT添加了剩余的代码以结束任何混乱。


你的问题不是同步与异步,而是你正在读取整个文件并且storing您之前内存中的文件部分做一点事与该数据。

如果您正在读取每一行,处理它并将结果写入另一个文件/数据库,那么StreamReader可以让您处理多 GB(或 TB)文件。

唯一的问题是,如果您在读完文件之前存储文件的一部分,那么您可能会遇到内存问题(但您会惊讶地发现可以让文件有多大)Lists & Dictionaries在内存耗尽之前获取)

您需要做的是尽快保存处理后的数据,而不是将其保留在内存中(或尽可能少地保留在内存中)。

对于很大的文件,您可能需要将工作集(您的处理数据)保存在数据库中 - 可能像 SqlExpress 或 SqlLite 之类的东西可以做到(但同样,这取决于您的工作集有多大)。

希望这对您有所帮助,请随时在评论中提出进一步的问题,或编辑您的原始问题,如果我能以任何方式提供帮助,我将更新此答案。

更新 - 分页/分块

您需要以一页为单位读取文本文件,并允许用户滚动浏览文件中的“页面”。当用户滚动时,您会阅读并向他们展示下一页。

现在,您可以做一些事情来帮助自己,始终在内存中保留大约 10 页,这使得您的应用程序能够在用户快速向上/向下翻页时做出响应。在应用程序空闲时间(应用程序空闲事件)中,您可以阅读接下来的几页,再次丢弃当前页面之前或之后超过五页的页面。

向后分页是一个问题,因为您不知道文件中每一行的开始或结束位置,因此您也不知道每页的开始或结束位置。因此,对于向后分页,当您向下阅读文件时,请保留每页开头的偏移量列表(Stream.Pos),那么你可以很快Seek到给定位置并从那里读取页面。

如果您需要允许用户搜索文件,那么您几乎可以逐行读取文件(记住页面偏移量)查找文本,然后当您找到某些内容时,读入并呈现它们那个页面。

您可以通过将文件预处理到数据库中来加快一切速度,有网格控件可以处理动态数据集(它们将为您进行分页),并且您可以获得内置搜索/过滤器的好处。

所以,从一个certain从角度来看,这是在读取文件异步地,但这是从用户的角度来看的。但从技术角度来看,当我们谈论在编程时异步执行某些操作时,我们往往意味着其他含义。

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

读取非常大的文本文件,我应该合并异步吗? 的相关文章

  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 嵌套异步/等待 Nodejs

    似乎无法弄清楚为什么这对我不起作用 我有一个父函数 它对子加载进程执行 AWAIT LOAD 进程又调用另一个名为 LOADDATA 的 AWAIT 所以基本上是这样的 module exports async function try a
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12

随机推荐