快速处理大量 CSV 数据的最佳方法

2024-03-29

我有大量 CSV 数据集(10M+ 行)需要处理。我还有另外两个文件需要在输出时引用,它们包含的数据放大了我们对 CSV 文件中数百万行的了解。目标是输出一个新的 CSV 文件,其中每条记录都与其他文件中的附加信息合并。

想象一下,大型 CSV 文件包含交易,但客户信息和账单信息记录在另外两个文件中,我们希望输出一个新的 CSV,其中每笔交易都链接到客户 ID 和帐户 ID 等。

一位同事有一个用 Java 编写的函数程序来执行此操作,但速度非常慢。原因是,数百万行的 CSV 文件显然必须被遍历很多很多很多次。

我的问题是——是的,我正在解决这个问题——我应该如何在 Ruby 中解决这个问题?目标是让它更快(现在 18 小时以上,CPU 活动很少)

我可以将这么多记录加载到内存中吗?如果是这样,我该怎么办?

我知道这有点模糊。只是寻找想法,因为这对我来说有点新鲜。


这是我编写的一些用于处理大型 csv 文件(在我的情况下约为 180mb)的 ruby​​ 代码。

https://gist.github.com/1323865 https://gist.github.com/1323865

标准的 FasterCSV.parse 将其全部拉入内存需要一个多小时。这样就把时间缩短到了 10 分钟左右。

相关部分是这样的:

lines = []
IO.foreach('/tmp/zendesk_tickets.csv') do |line|
  lines << line
  if lines.size >= 1000
    lines = FasterCSV.parse(lines.join) rescue next
    store lines
    lines = []
  end
end
store lines

IO.foreach 不会将整个文件加载到内存中,而只是使用缓冲区逐步遍历它。当达到 1000 行时,它会尝试解析 csv 并仅插入这些行。一个棘手的部分是“下一步救援”。如果您的 CSV 包含一些跨多行的字段,您可能需要多获取几行才能获取有效的可解析 csv 字符串。否则,您所在的线路可能位于田野的中间。

在要点中,您可以看到另一个很好的优化,它使用 MySQL 的更新ON DUPLICATE KEY。这允许您批量插入,如果检测到重复键,它只会覆盖该行中的值,而不是插入新行。您可以将其视为一个查询中的创建/更新。您需要在至少一列上设置唯一索引才能使其正常工作。

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

快速处理大量 CSV 数据的最佳方法 的相关文章

  • 使用 ruby​​ 获取 URL 的内容长度

    我正在尝试编写一个 ruby 脚本 该脚本使用以下命令获取有关网站上文件的一些详细信息net http 我的代码如下所示 require open uri require net http url URI parse asset res N
  • Jekyll 服务错误:找不到 gem jekyll (>= 0.a) (Gem::GemNotFoundException

    做的时候sudo jekyll serve我收到以下错误 Users myusername rvm rubies ruby 2 4 2 lib ruby site ruby 2 4 0 rubygems rb 271 in find spe
  • 如何确定 CSV 文件字段是制表符分隔还是逗号分隔?

    我试图确定 CSV 文件字段是制表符分隔还是逗号分隔 我需要 PHP 验证 我怎样才能确定这一点 现在回答这个问题已经太晚了 但希望它能对某人有所帮助 这是一个简单的函数 它将返回文件的分隔符 function getFileDelimit
  • 在 OS X 10.7.4 上安装 RSRuby 时找不到库

    我正在尝试在我的 Mac 上安装 RSRuby 调用后 sudo gem install rsruby 我收到此错误 ERROR Cannot find the R library aborting extconf rb failed Co
  • Ruby - 乘法问题

    我的输出是这样的 ruby 1 9 2 p290 011 gt 2 32 3 gt 6 959999999999999 我记得有一天在另一台机器上我得到了它就像 2 32 3 6 我的错误是什么 非常感谢您阅读本文 如果您确实想向下舍入为整
  • Bundler 似乎无法通过 Rbenv 找到正确的 Ruby

    多年来我一直使用 RVM 作为 Ruby 版本管理器 但由于其简单性 我想改用 rbenv 但是我在部署时发现了一些奇怪的问题 这似乎是错误的地方 env RBENV ROOT home deploy rbenv PATH home dep
  • Rails 4.0 expire_fragment/缓存过期不起作用

    我一直在尝试使用 Rails 的缓存功能 但我无法使某些缓存片段过期 尽管它们似乎已过期 使用 Rails 教程网站中指出的 Russian Doll Caching 我正在使用此配置 我使release controller rb 控制器
  • 单表继承发现问题

    我有以下3个rails类 它们都存储在一张表中 使用rails的单表继承 class Template lt ActiveRecord Base class ThingTemplate lt Template class StockThin
  • 使用 bcrypt-ruby 使用版本 $2y 验证哈希密码

    我们陷入了困境 需要使用 Ruby 根据现有的用户数据库对用户进行身份验证 用户的密码都是使用password compat PHP库生成的 所有散列密码均以 2y 开头 我一直在使用 bcrypt ruby 尝试对用户进行身份验证 但没有
  • Ruby 元编程,RSpec 的“应该”如何工作?

    我正在阅读 RSpec 并试图弄清楚 RSpec 的 应该 是如何实现的 有人可以帮忙解释一下这个函数的元性质是如何工作的吗 代码位于此处 http github com dchelimsky rspec blob master lib s
  • 如何在byte[]中制作csv?

    我想知道我应该如何创建一个在 byte 中创建 csv 文件的方法 目前我正在使用这样的东西 public byte makeCsv StringBuffer csv new StringBuffer csv append columnhe
  • FieldPath 字段名称不能包含“.”当尝试使用 AGGREGATE 时

    我的查询有什么问题吗 db table aggregate match gt expr gt and gt eq gt size gt events 4 events 0 updated gt lt gt 2019 05 05 我越来越 M
  • Rails 应用程序中的持久 TCP 连接

    我有一个在服务器上运行的第三方应用程序 它对客户端进行身份验证并返回响应 我的问题是 对于我收到 Rails 应用程序的每个请求 我都需要建立 TCP 连接并获取数据 是否可以有一个持久连接 以便我可以减少建立连接的开销 我希望你使用的是
  • RSpec 抛出分段错误

    有时我的测试套件会无缘无故地抛出分段错误 这是输出 Users Test rvm gems ruby 1 9 3 p392 gems activerecord 3 2 9 lib active record relation query m
  • 如何在启动 Rails 控制台时自动运行代码?

    假设每次 Rails 控制台出现时我都想要一个问候语 Scotts MBP 4 ucode scott rails c Loading development environment Rails 4 2 1 Hello there I m
  • 尝试从 Rails 控制器调用辅助方法时出现 NoMethodError

    我得到了一个NoMethodError当尝试从我的控制器类之一访问我的帮助器模块之一中定义的方法时 我的 Rails 应用程序使用helper类方法与 all符号如下图所示 class ApplicationController lt Ac
  • Mongoid 4 / MongoDB 2.4+“冻结”问题

    自从使用 Mongoid 维护与 mongodb 的连接以来 我遇到了一个奇怪的问题 我认为这最初是由于升级到 Rails 4 0 需要更新 Mongoid Moped 但我在其他基于 Rack 的应用程序 具体来说是 Sinatra 和
  • ruby 中的树结构,父子采用数组格式,没有 gem?

    我有一个数组 其中包含这样的项目列表 arr id gt 1 title gt A parent id gt nil id gt 2 title gt B parent id gt nil id gt 3 title gt A1 paren
  • 遏制gem安装:捆绑安装失败,但正常gem安装有效[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions solve
  • python csv按列转换为字典

    是否可以将 csv 文件中的数据读取到字典中 使得列的第一行是键 同一列的其余行构成列表的值 例如 我有一个 csv 文件 strings numbers colors string1 1 blue string2 2 red string

随机推荐

  • jQuery 过滤器:包含链接(a href="#")

    我有一个当前的链接 a href 但很快客户就会将链接更改为 a href something 当链接变成某种东西时 我想使用 jQuery 来更改 css 但我不知道如何为属性编写过滤器 href 您可以使用以下两个选项来比较您的href
  • cypress 支持软断言吗?

    cypress 支持软断言吗 例如 我正在浏览 n 个元素并想要验证它们的值 如果任何元素的值不匹配 则测试失败 它不会继续验证下一个元素的值 有没有办法验证所有元素值并在最后显示失败的值 EDIT 我可能误解了 如果你的意思是软断言cy命
  • Cookie 未更新

    我正在尝试更新 cookie 值 但它不起作用 我尝试过的所有操作都不会更新 cookie 而且我总是得到 cookie 的初始值 所以我进行了搜索 根据 MSDN 我应该能够通过执行以下操作来更新 cookie HttpCookie co
  • JFrame背景图片

    我正在创建一个简单的 GUI 我希望有一个背景图像 2048 X 2048 填充整个窗口 并在左上角有一个正方形 可以偶尔加载 64 X 64 图像 如何才能做到这一点 我已经知道如何设置 JFrame 的大小 它的图像加载我需要帮助 这是
  • 为什么 java.awt.Point 提供了设置和获取双精度数的方法,但将 x 和 y 存储为 int?

    正如您在 Oracle 文档中看到的java awt Point http docs oracle com javase 6 docs api java awt Point html x 和 y 存储为int 然而 getX and get
  • 创建服务(SERVICE_ACCEPT_SESSIONCHANGE)

    我正在尝试按照以下链接中记录的示例创建服务 http msdn microsoft com en us library bb540475 v VS 85 aspx http msdn microsoft com en us library
  • git-svn 变基错误

    运行 git svn rebase 后出现以下错误 update index refresh 命令返回错误 1 有任何想法吗 以下是整个输出 git svn rebase dry run xxx iphone xxx prototype2
  • 查找字符串中的所有字符串

    我通过 http 请求响应文本获取 StrTxt 作为 html 字符串 我想找到 StrTxt 中所有出现的 字符串 像这样的东西 for each string in StrTxt StrTxt all matched strings
  • $location.path 在一定的超时后不起作用

    我正在尝试执行登录身份验证 并且正在尝试使用 angularJS 显示进度视图 例如 app config function locationProvider routeProvider routeProvider when templat
  • 将左值绑定到右值引用时 std::forward 与 std::move

    这里的移动和前进有区别吗 void test int val val 4 void main int nb test std forward
  • Yii2 错误:yii\base\UnknownMethodException:调用未知方法:yii\web\UrlManager::addRules()

    今天更新作曲家依赖项 使用作曲家更新命令 后 我的 Yii2 应用程序损坏了 它抛出未知方法 yii base UnknownMethodException 调用未知方法 yii web UrlManager addRules 检查后供应商
  • 隐藏和删除 ssrs 报告中标题的空白

    我正在研究一个ssrs报告 我可以隐藏最后一页上的标题 IIF Globals PageNumber Globals TotalPages 1 or Globals PageNumber Globals TotalPages true fa
  • ExpansionTile 不保持状态

    以下问题 我有一个清单扩展瓷砖 https docs flutter io flutter material ExpansionTile class html效果很好 我面临的唯一问题是 滚动到视图之外的展开的 ExpansionTile
  • android - Moto G 手机未显示在 Eclipse 的设备列表中

    我正在尝试将 Moto G Mobile 连接到我的 Windows 7 32 位计算机中的 Eclipse 但它没有显示在设备列表中 为此 首先我通过 USB 电缆将设备连接到机器 然后选择PTP模式 然后我检查了设备设置中的 USB 调
  • Spring批处理返回自定义进程退出代码

    我有一个包含多个作业的 jar 我只想每次只执行一个作业并检索自定义退出代码 例如 我有基本工作 retrieveErrorsJob 配置 只需一步即可读取输入 XML 文件并将数据写入特定数据库表中 应用类 SpringBootAppli
  • CMake - 删除单个翻译单元的编译标志

    我想删除单个翻译单元的设置编译标志 有没有办法做到这一点 例如使用set property 注意 编译标志没有 fno name否定 无论出于何种原因 我试过了 get property FLAGS TARGET target PROPER
  • 二维网格中的不同随机点

    我有一个大的二维网格 比如说 10000 X 10000 我需要从这些网格中选择 1000 个随机点 但我还需要注意这两个点都不相同 我想到的标准方法是在选择每个点之后 我应该检查所有先前的条目以查看该点是否已被选择 但对于大网格和大量点来
  • 连接到 EC2 Django 开发服务器

    我是 EC2 和 Web 开发的新手 目前我有一个正在运行的 Linux EC2 实例 并且已经安装了 Django 在开始我的实际项目并尝试运行 Django 测试服务器之前 我正在创建一个测试项目 这是我在 shell 中的输出 pyt
  • matplotlib:半球/楔形的自定义投影

    我正在看定制投影 http matplotlib sourceforge net examples api custom projection example htmlmatplotlib 库中的示例 我正在尝试修改它以仅绘制南半球 我已将
  • 快速处理大量 CSV 数据的最佳方法

    我有大量 CSV 数据集 10M 行 需要处理 我还有另外两个文件需要在输出时引用 它们包含的数据放大了我们对 CSV 文件中数百万行的了解 目标是输出一个新的 CSV 文件 其中每条记录都与其他文件中的附加信息合并 想象一下 大型 CSV