在 C# 中有效读取超大文件。目前使用 StreamReader

2024-02-20

我有一个大小为 50GB 及以上的 Json 文件。 以下是我编写的用于读取一小部分 Json 的内容。我现在需要修改它以读取大文件。

internal static IEnumerable<T> ReadJson<T>(string filePath)
{
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
    using (StreamReader sr = new StreamReader(filePath))
    {
        String line;
        // Read and display lines from the file until the end of
        // the file is reached.
        while ((line = sr.ReadLine()) != null)
        {
            byte[] jsonBytes = Encoding.UTF8.GetBytes(line);
            XmlDictionaryReader jsonReader = JsonReaderWriterFactory.CreateJsonReader(jsonBytes, XmlDictionaryReaderQuotas.Max);
            var myPerson = ser.ReadObject(jsonReader);
            jsonReader.Close();

            yield return (T)myPerson;
        }
    }
}
  1. 如果我在当前代码中构造 StreamReader 时指定缓冲区大小就足够了吗?
  2. 如果我在这里错了,请纠正我。缓冲区大小基本上指定一次从磁盘读取到内存的数据量。因此,如果文件大小为 100MB,缓冲区大小为 5MB,则每次读取 5MB 到内存,直到读取整个文件。
  3. 假设我对第 3 点的理解是正确的,对于如此大的文本文件,理想的缓冲区大小是多少? int.Max 大小是一个坏主意吗?在 64 位 PC 中,int.Max 大小为 2147483647。我假设缓冲区大小以字节为单位,计算结果约为 2GB。这本身可能会消耗时间。我正在寻找 100MB - 300MB 之类的缓冲区大小。

它将一次读取一行(输入文件的),可能是 10 个字节,也可能是 50GB。所以归结为:输入文件的结构如何?如果输入 JSON 有换行符other而不是在物体之间的间隙处干净地清洁,这可能会变得非常糟糕。

缓冲区大小可能会影响读取量在寻找时对于每行的末尾,但最终:它每次都需要找到一个换行符(至少,目前是如何编写的)。

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

在 C# 中有效读取超大文件。目前使用 StreamReader 的相关文章

  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 检查两个函数或成员函数指针的签名是否相等

    我编写了一些代码来检查自由函数的签名是否等于成员函数的签名等 它比较提取的返回类型和函数参数 include
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 应在堆栈上分配的最大数量

    我一直在寻找堆栈溢出有关应在堆栈上分配的最大内存量的指南 我看到了堆栈与堆分配的最佳实践 但没有关于应该在堆栈上分配多少以及应该在堆上分配多少的指南 有什么想法 数字可以作为指导吗 什么时候应该在堆栈上分配 什么时候应该在堆上分配 多少才算
  • 意外的 const 引用行为

    include
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • 如何解析Python库中的数据包? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何使用 python 从 pcap 文件或接口解析数据包 我正在专门寻找一个使用记录良好的库的解决方案
  • 如何以编程方式更改默认声音播放设备?

    如何以编程方式更改 vista 中播放和录制的默认音频设备 是否有像Windows XP中的声音管理器那样的注册表设置 哪个 API 可以实现 系统托盘音频设备切换器使用 Software Microsoft Multimedia Soun
  • 零寄存器如何提高性能?

    在 MIPS ISA 中 有一个零寄存器 r0 始终给出零值 这允许处理器 任何产生要被丢弃的结果的指令都可以将其目标定向到该寄存器 成为一个来源0 据说在这source https web archive org web 20170328
  • 使用 pyspark 结构化流计算移动平均列

    我正在使用 pyspark 处理一些传入的流数据 我想向我的数据帧添加一个具有 50 秒移动平均值的新列 我尝试使用带有 rangeBetween 的 Window 规范 import pyspark sql window as W w W
  • 导入 mysql.connector ModuleNotFoundError:没有名为“mysql.connector”的模块; “mysql”不是一个包

    导入 mysql connector ModuleNotFoundError 没有名为 mysql connector 的模块 mysql 不是一个包 pip 安装 mysql connector python rf python版本 3
  • 无法显示希腊字符 .mdb 文件(PHP 和 ODBC)

    我在显示 MS Access 2007 表中希腊语列中的文本时遇到问题 我正在使用 PHP 和 dbc odbc pconnect Driver Microsoft Access Driver mdb Dbq mdbFilename use
  • 使用 PHP 分块传输 FTP 上传?

    是否可以使用 PHP 进行 FTP 上传 我有文件需要上传到另一台服务器 但我只能通过 FTP 访问该服务器 不幸的是 我无法增加该服务器上的超时时间 有可能做到这一点吗 基本上 如果有一种方法可以写入文件的一部分 然后附加下一部分 并重复
  • 如何使用图像代替box-shadow来达到类似的效果?

    我想要实现如下图所示的框阴影效果 图片在这里 https i stack imgur com BpqGM png 但是我不想使用css3box shadow财产 这是因为我正在构建一个phonegap android应用程序 并且在使用时存
  • 使用react-loadable延迟加载组件的动态路径导入

    我正在使用 create react app 创建一个应用程序 并使用 React loadable 延迟加载组件 我想要做的是导入加载器对象或react loadble模块的Loadable函数的动态路径 Code const Loada
  • npm install 缺少模块

    在我能跑之前gulp在我的项目中我需要运行npm install 除了在我的计算机上之外 这都有效 因为我收到以下错误 Error Cannot find module socket io at Function Module resolv
  • 加密会话变量有安全方面的好处吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 所有字母的正则表达式

    我需要所有字母表的正则表达式 我有一个输入和目标文本 它们都可以属于不同的字母表 我的意思是它们可以属于中文 拉丁文 西里尔文和任何其他字母 我需要一个用于多语言输入和多语言目标文本的正则表达式 有人对此有任何想法吗 我该如何编写这个正则表
  • 容器中的共享库

    对于两个进程A和B 都使用库libc so libc so只加载到内存一次 当 A 和 B 都运行在同一主机和同一 rootfs 上时 这是正常情况 对于容器来说 如果A和B运行在不同的容器中 A和B是否共享相同的内存区域 例如 image
  • 在scala Spark2中运行saveAsNewAPIHadoopDataset到hbase时出现空指针异常

    我正在使用 saveAsNewAPIHadoopDataset 将 RDD 保存到 Hbase 中 以下是我的工作创建和提交 val outputTableName test3 val conf2 HBaseConfiguration cr
  • Excel VBA - 连接两个数组

    我需要将两个数组 vd 和 vd1 连接到 vdu 中 ReDim vdu 1 To UBound vd 1 UBound vd1 1 1 To 1 For i 1 To UBound vd 1 vdu i 1 vd i 1 Next i
  • VB 中的 With 语句中有多个对象吗?

    我在 VB 中使用了很多标签With语句来设置它们的属性 Problem有什么办法我可以做类似以下的事情 With lblA lblB lblC fontColor color Red End With 这可能吗 还是我必须手动执行With
  • 删除 BeautifulSoup 分解后变空的行

    我试图从文件中删除某些 HTML 标签及其内容BeautifulSoup 如何删除应用后变为空的行decompose 在这个例子中 我想要之间的线a and 3消失 因为这是 span span 块了 但到底不行 from bs4 impo
  • Django ..“加入”查询?

    伙计们 Django 中的 join 查询如何或在哪里 我认为 Django 没有 加入 但是我将如何加入 Thanks 如果您使用模型 则 select lated 方法将返回您在该模型中设置的任何外键 最多达到您指定的限制 的对象
  • Firebase + React Native:离线身份验证

    我在 React Native iOS 应用程序中使用 Firebase 主要用于存储用户数据和用户身份验证 效果很好当设备确实有可用的网络连接时 当谈到Firebase的离线功能时 它看起来像这样 问题 在没有网络连接的情况下启动应用程序
  • 在 C# 中有效读取超大文件。目前使用 StreamReader

    我有一个大小为 50GB 及以上的 Json 文件 以下是我编写的用于读取一小部分 Json 的内容 我现在需要修改它以读取大文件 internal static IEnumerable