120 MB CSV 文件的 String.Split() 上的 .NET System.OutOfMemoryException

2024-01-10

我正在使用 C# 读取约 120 MB 的纯文本 CSV 文件。最初,我通过逐行读取来进行解析,但最近确定首先将整个文件内容读入内存会快很多倍。解析已经相当慢了,因为 CSV 的引号内嵌入了逗号,这意味着我必须使用正则表达式拆分。这是我发现的唯一一个可以可靠工作的:

string[] fields = Regex.Split(line, 
@",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)
(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))");
// from http://regexlib.com/REDetails.aspx?regexp_id=621

为了在将整个内容读入内存后进行解析,我对换行符进行了字符串分割,以获得包含每一行的数组。但是,当我对 120 MB 文件执行此操作时,我得到一个System.OutOfMemoryException。为什么我的电脑有 4 GB RAM,但内存却很快用完?有没有更好的方法来快速解析复杂的 CSV?


除非必要,否则不要推出自己的解析器。我很幸运有这个:

快速 CSV 阅读器 http://www.codeproject.com/KB/database/CsvReader.aspx

如果没有别的事,你可以看看幕后,看看其他人是如何做的。

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

120 MB CSV 文件的 String.Split() 上的 .NET System.OutOfMemoryException 的相关文章

随机推荐

  • 为什么 Android Studio 不接受新的 Java JDK 位置

    我试图将 JDK 位置从 C Program Files Java jdk1 7 0 09 更改为 C Program Files Java jdk1 8 0 25 但 Android Studio 似乎完全忽略了更改 该位置仍然是 C P
  • 为什么 PHP 中的链接服务器查询需要将 ANSI_NULLS 和 ANSI_WARNINGS 设置为 on?

    我有一个使用 OpenQuery 的链接服务器语句 SELECT mycol1 mycol2 mycol3 FROM OPENQUERY MYLINKEDSERVER SELECT FROM mysqldb table 上述内容在 SSMS
  • 为什么在这个简单的基准测试中 SQLite 比 Redis 更快?

    我在本地机器上做了简单的性能测试 这是python脚本 import redis import sqlite3 import time data N 100000 for i in xrange N key key str i value
  • 如何将 Font Awesome 图标水平居中?

    我有一张桌子 上面有字体真棒 http fortawesome github io Font Awesome 图标 我想将文本左对齐和居中对齐 我尝试过居中 i 但不起作用 HTML td i class icon ok i td CSS
  • Android:意图标志销毁活动并开始新活动

    所以我有一个登录活动 此活动会膨胀一个具有 USER NAME 和 PASSWORD EditText 视图的 login xml 布局 当我输入用户名和密码并单击登录按钮时 我会启动一个新活动 新的活动有一个注销按钮 它基本上只是启动前一
  • FoldList 类似于 J 中的原语

    Mathematica 有一个内置函数 称为FoldList FoldList函数说明 http reference wolfram com mathematica ref FoldList html J中有类似的原语动词吗 我知道 J 有
  • 如何保存 Eclipse 设置(字体、格式等)?

    如何在 Eclipse 3 6 中导出我的设置 字体 语法着色 格式等 以便我可以在另一个安装中再次使用它们 您可以将文件夹 metadata 保存在工作区中 该文件夹包含您的首选项 只需在重新安装并完成后恢复它即可 请注意 metadat
  • Azure DevOps 管道触发器问题消息不会消失

    我们的团队正在实施 Azure DevOps 测试管道 在我们最初提交创建管道 yml 文件后 显示了此错误消息 经过研究后 我意识到我忘记将触发器包含在 yml 中 但是添加后 这个错误消息并没有消失 不过 管道正在按预期工作 我们只是使
  • Asp .Net Core单元测试模拟UserManager.CreateAsync并返回Identity结果

    致力于 Net Core 项目并创建了以下服务来跨页面共享通用方法 namespace MyApp Tests Services public class UserServiceTest Fact public async Task Cre
  • C++ 使用大括号而不是赋值运算符声明和实例化作用域变量

    我正在观看 Bjarne Stroustrup 关于 C 11 风格的主题演讲 link http channel9 msdn com Events GoingNative GoingNative 2012 Keynote Bjarne S
  • 删除超过 2 小时的 Firebase 数据

    我想删除超过两个小时的数据 目前 在客户端 我循环遍历所有数据并对过时的数据运行删除 当我这样做时 db on value 每次删除某些内容时都会调用该函数 另外 只有当客户端连接时才会删除内容 如果两个客户端同时连接会发生什么 我在哪里可
  • 我应该使用“==”进行 .NET 本地化字符串比较吗?

    NET 中不使用 比较本地化字符串的原因是什么 如果我使用 CultureInfo 将如何执行比较 如果将文化感知字符串与 进行比较 例如 Strasse 与 Stra e 则返回 false 如果您需要对 UI 内容进行文化感知比较 Li
  • Map>

    Java 为我提供了
  • Android Maps API 版本 1 到版本 2 的迁移

    背景 我继承了别人的问题 并正在尝试启动并运行一个应用程序 多名开发人员放弃了该项目 现在轮到我了 我是一名 iOS 开发人员 但我已经完成了一些简单的 Android 项目 问题应用程序是一个原生 Android 最初使用 API 级别
  • IISExpress 是单线程的吗?

    我正在编写一个利用声明来确保安全的自定义 Net 应用程序 因为我们正在跨越许多边界 Web API 批处理等 在开发过程中 有时我会在通过 Chrome 登录时在系统中创建一些内容 然后我会通过 Edge 中的另一个帐户来测试新创建的项目
  • 如何在 git 中显示作者贡献的统计信息?

    我正在与一个团队合作开发一个 git 项目 我希望看到每个作者在编写的行数或编辑的行数等方面的贡献 我如何显示作者的统计数据 很简单 git shortlog s n
  • 使用robotframework api从python执行robot关键字

    用机器人语言编写复杂的机器人关键字有时非常耗时 因为机器人语言不是真正的编程语言 我想用 python 编写我的关键字 并且只用 robotsframework 语言公开简单的 html 表 问题是我们已经有很多用机器人语言编写的低级机器人
  • 如何验证电话号码格式

    我即将创建电话号码格式验证 格式为 10 位数字 包括加号 例如 0133999504 尽管我已经声明了模式 但我尝试禁止使用 符号或任何其他字符 但验证不起作用 还有其他想法或解决方案吗 1st I declared the string
  • 编译Python代码并将其链接到C++程序?

    我很清楚存在许多允许 C 代码运行 python 代码的可能性 反之亦然 Cython Boost Python 然而 除非我弄错了 所有这些方法都只是 调用 相关的 python 脚本并管理 C 程序和 python 脚本之间的交互 因此
  • 120 MB CSV 文件的 String.Split() 上的 .NET System.OutOfMemoryException

    我正在使用 C 读取约 120 MB 的纯文本 CSV 文件 最初 我通过逐行读取来进行解析 但最近确定首先将整个文件内容读入内存会快很多倍 解析已经相当慢了 因为 CSV 的引号内嵌入了逗号 这意味着我必须使用正则表达式拆分 这是我发现的