使用 ruby​​ 流式传输并解压大型 csv 文件

2024-01-10

我遇到问题,需要下载、解压缩,然后逐行处理一个非常大的 CSV 文件。我认为让您了解文件有多大很有用:

  • big_file.zip ~700mb
  • big_file.csv ~23gb

这是我希望发生的一些事情:

  • 解压前不必下载整个文件
  • 在解析 csv 行之前不必解压整个文件
  • 执行所有这些操作时不要消耗太多内存/磁盘

我不知道这是否可能。这就是我的想法:

require 'open-uri'
require 'rubyzip'
require 'csv'

open('http://foo.bar/big_file.zip') do |zipped|
  Zip::InputStream.open(zipped) do |unzipped|
    sleep 10 until entry = unzipped.get_next_entry && entry.name == 'big_file.csv'
    CSV.foreach(unzipped) do |row|
      # process the row, maybe write out to STDOUT or some file
    end
  end
end

以下是我所知道的问题:

  • open-uri读取整个响应并将其保存到Tempfile对于这种大小的文件来说这不太好。我可能需要使用Net::HTTP直接但我不知道如何做到这一点并且仍然得到IO.
  • 我不知道下载速度有多快,也不知道是否可以Zip::InputStream按照我展示的方式工作。当文件尚未全部存在时,它可以解压部分文件吗?
  • 会不会CSV.foreach使用 ruby​​zip 的InputStream?它的行为是否足够像File它能够解析出行吗?如果它想读取但缓冲区是空的,它会惊慌吗?

我不知道这是否是正确的方法。也许某些 EventMachine 解决方案会更好(虽然我以前从未使用过 EventMachine,但如果它对于这样的事情效果更好,我完全赞成)。


自从我发布这个问题以来已经有一段时间了,如果其他人遇到这个问题,我认为可能值得分享我的发现。

  1. 对于行数,我正在处理 Ruby 的标准库CSV太慢了。我的 csv 文件非常简单,我不需要所有这些东西来处理引用的字符串或类型强制。只需使用就容易多了IO#gets然后用逗号分隔该行。
  2. 我无法将整个内容从 http 传输到Zip::Inputstream对某些人IO包含 csv 数据。这是因为zip 文件结构 https://en.wikipedia.org/wiki/Zip_(file_format)#Structure文件末尾有中央目录结尾 (EOCD)。这是提取文件所必需的,因此从 http 流式传输它似乎不起作用。

我最终采用的解决方案是将文件下载到磁盘,然后使用 Ruby 的 open3 库和 Linuxunzip包以流式传输 zip 中未压缩的 csv 文件。

require 'open3'

IO.popen('unzip -p /path/to/big_file.zip big_file.csv', 'rb') do |io|
  line = io.gets
  # do stuff to process the CSV line
end

The -p打开 unzip 将提取的文件发送到 stdout。IO.popen然后使用管道使其成为IO红宝石中的对象。效果非常好。你可以将它与CSV如果你想要额外的处理,那对我来说太慢了。

require 'open3'
require 'csv'

IO.popen('unzip -p /path/to/big_file.zip big_file.csv', 'rb') do |io|
  CSV.foreach(io) do |row|
    # process the row
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ruby​​ 流式传输并解压大型 csv 文件 的相关文章

  • 什么时候需要将参数传递给“Thread.new”?

    在线程外部定义的局部变量似乎从内部可见 因此以下两种用法Thread new似乎是一样的 a foo Thread new puts a gt foo Thread new a a puts a gt foo The document ht
  • 为什么 Ruby 使用 respond_to?而不是respond_to?

    我很好奇为什么 Ruby 用于检查对象是否响应方法的内省相关方法是respond to 代替responds to 我总是觉得很尴尬 但也许那是因为我已经习惯了respondsToSelector在 Objective c 中 Matz p
  • 如何从 method_missing 获取绑定?

    我试图找到一种方法来从 Ruby 1 8 中的 method missing 中的调用者获取绑定 但我似乎找不到方法来做到这一点 希望下面的代码能解释我想做的事情 class A def some method x 123 nonexist
  • NumPy genfromtxt:正确使用filling_missing

    我正在尝试处理保存到 CSV 的数据 这些数据可能在未知数量的列 最多大约 30 列 中缺少值 我正在尝试使用将这些缺失值设置为 0 genfromtxt s filling missing争论 这是在 Win 7 上的 ActiveSta
  • 读取不同文件夹深度的多个 csv 文件

    我想递归地将给定文件夹中的所有 csv 文件读入 Spark SQLDataFrame如果可能的话 使用单一路径 我的文件夹结构如下所示 我想包含具有一个路径的所有文件 resources first csv resources subfo
  • Ruby 中的关键字在哪里定义?

    我正在查看 Ruby 文档 想知道是否一切都是对象 那么 关键字 也是对象 对吗 如果是这样 它们在 ruby 中是在哪里定义的 下面的页面完全让我困惑 因为它显示了包含所有关键字的对象 但这不是所有类使用的官方对象 这是否以某种方式来自不
  • ruby 1.9.1 的 gem install mongrel 失败

    昨天我开始了 Rails 开发 我安装了 ruby 1 9 1 rubygems 和 Rails 跑步gem install mongrel工作得很好 表面上也安装了杂种 我有点困惑 因为 script server 默认启动 webric
  • 在 Rails 中强制内联渲染 PDF 文档

    我正在编写一个从一组 XML 文件生成 PDF 文件的服务 正在正确生成 PDF 但是 每次我单击 查看 PDF 链接时 浏览器都会要求用户下载 PDF 文件 我需要 PDF 内联显示 就像任何常规 HTML 页面一样 我虽然我写的代码是正
  • 有没有办法让 Ruby 临时文件永久存在?

    如果我通过创建了一个临时文件Tempfile 除了将其复制到另一个文件之外 还有什么方法可以使其 永久 吗 我想避免它在关联时被删除Tempfile实例被垃圾收集或进程被终止 在相关的一点上 有没有办法利用Tempfile机制 或使用类似的
  • Ruby 解释器出现段错误后,是否可以从 corefile 中获取 Ruby 回溯?

    Note 我使用了在使用 libxml ruby gem 时遇到的段错误来说明问题 但我已经用所述 gem 解决了我的问题 这个问题真正涉及的是从 gdb 使用 corefile 查看 Ruby 回溯 即解释器在 Ruby 代码无法处理异常
  • Ruby:要散列的数组,没有任何局部变量

    我有一个字符串数组 array foo bar baz 我试图将其转变为以下内容 foo gt nil bar gt nil baz gt nil 我一直在这样做 new hash array each k new hash k nil n
  • Mountain Lion 的 RVM 问题

    我可以在运行 Mountain Lion 的 Mac 上安装任何 Ruby 版本 我已经确保 Brew Doctor 一切正常 当我运行 ie rvm intall 1 9 3 head 时 我得到以下信息 From git github
  • ruby 包含问题

    class Foo def initialize a puts Hello a end end module Bar def initialize b puts b World end end class Sample lt Foo inc
  • 如何将列表字典写入字符串而不是 CSV 文件?

    This 堆栈溢出问题 https stackoverflow com questions 37997085 how to write a dictionary of lists to a csv file将列表字典写入 CSV 文件的答案
  • 如何将字符串拆分为新行并保留空白行?

    给出 ruby 代码 aaaa nbbbb n n split n 这输出 aaaa bbbb 我希望输出包含由 n n 我想要的结果是 aaaa bbbb 获得这个确切结果的最简单 最好的方法是什么 我建议使用lines代替split为了
  • 如何在 Rails 3 项目中包含 SSL 证书

    我开发了一个 Rails 3 项目 它使用thin作为服务器 与 Devise 和 Doorkeeper 一起进行身份验证 我想在我的项目中添加 SSL 证书 我看过一些描述如何在 Rails 3 项目中使用 SSL 证书的帖子 但没有一个
  • 如何查看移动设备是否已注册

    我正在使用适用于 Amazon SNS 的 Amazon AWS Ruby SDK 但在已注册的设备方面遇到一些问题 有时 当设备再次注册时 我会收到类似错误AWS SNS Errors InvalidParameter Invalid p
  • “gem install Rails”因 DNS 错误而失败

    rvm use Using home owner rvm gems ruby 2 1 2 gem install rails ERROR While executing gem Gem RemoteFetcher FetchError Er
  • CanCan load_and_authorize_resource 触发禁止属性

    我有一个使用强参数的标准 RESTful 控制器 class UsersController lt ApplicationController respond to html js def index users User all end
  • 检查 Ruby 上的浏览​​器控制台输出

    如何检查浏览器控制台是否有错误 例如 我用 Selenium 启动了浏览器 firefox 的 chrome 并且用 Selenium WebDriver 做了一些操作 之后我想知道网络控制台中是否有任何错误 我尝试接受控制台错误 例如 d

随机推荐

  • Ubuntu下Visual Studio Code显示错误

    我的 Visual Studio Code 遇到了好几天的问题 无法启动它 事实上 窗口几乎全黑 这是我从终端启动它时的控制台输出 bash impossible de r gler le groupe de processus du te
  • 如何构建具有未知列数的 WPF 数据网格

    我需要从 txt 中获取的字符串数组集合构建并显示 WPF 数据网格 问题是我不知道先验的列数 即单个数组中的项目数 所以我在我的xaml中定义
  • MySQL 上 NOT IN 的替代方案

    我有一个疑问 SELECT DISTINCT phoneNum FROM Transaction Register WHERE phoneNum NOT IN SELECT phoneNum FROM Subscription LIMIT
  • 如何使用 EF4 Fluent API 将删除级联到链接表中?

    我在现有 MSSQL 2008 R2 数据库中有两个表 它们通过链接表关联 这两个表是 计划 和 提示 链接表是 PlanTipLinks 计划可以有许多提示 并且提示可以与多个计划关联 即 这是多对多的关系 在应用程序中 我只关心 Pla
  • 如何在wpf中使富文本框自动调整大小?

    如何让RichTextBox自动调整大小 我希望我的富文本框能够适合我分配给它的任何文本 而无需滚动条 谢谢 Set the HorizontalAlignment and VerticalAlignment除了Stretch 这是默认值
  • 如何向 iso 8583 消息添加使用 jpos 的标头。 - ISO 8583 - jpos

    我是使用 iso 8583 进行开发的新手 我需要在 iso 消息之前添加标头 但我以这种方式实现它们 并且不会将其添加到消息标头中 我究竟做错了什么 我希望你可以帮助我 GenericPackager packager new Gener
  • 异步写入文件

    有没有办法编写一个异步函数来重复将数据写入文件 当我编写异步函数时出现以下错误 该进程无法访问文件 c Temp Data txt 因为该文件正在被另一个进程使用 public void GoButton Click object send
  • 如何为

    我只有 HTML 和 CSS 的基本知识 并且广泛地浏览了 Google 试图找到这个问题的答案 这一切似乎都指向 JavaScript 和 或 jQuery 我试过了 但无法让它工作 我有一个音频文件 在我的网站加载时开始播放 我想设置一
  • 如何将

    转换为换行符?

    假设我有一个 HTML p and br 里面有标签 之后 我将剥离 HTML 以清理标签 我怎样才能把它们变成换行符 我正在使用Python的美丽汤 http www crummy com software BeautifulSoup 图
  • 如何在 REST 中处理 @OneToMany 关系

    我正在设计一个小REST允许执行一些基本操作的应用程序 到目前为止一切顺利 我有以下 Entity called Client需要与 Entity called Loan Client Entity Table name clients p
  • 升级到 PyMongo 3.0 导致 ServerSelectionTimeoutError

    我最近将 Bottle uWSGI Nginx 应用程序升级到 MongoDB 3 0 2 它在 PyMongo 2 8 上运行良好 但今天我通过运行以下命令升级到 PyMongo 3 0 pip install upgrade pymon
  • 三次 Hermite 样条插值 python

    我想计算一个三次多项式 该多项式由其函数值和指定点的导数定义 https en wikipedia org wiki Cubic Hermite spline https en wikipedia org wiki Cubic Hermit
  • 如何计算正确的 apkCertificateDigestSha256 有权访问证书?

    SafetyNet 文档 https developer android com training safetynet attestation https developer android com training safetynet a
  • “转到定义”始终位于 VSCode 的新选项卡中

    我在 MAC BigSur 上安装了 VSCode 每当我单击 转到定义 时 它应该以new标签 如何实现这一目标 目前 仅当定义存在于另一个文件中时 定义才会在新选项卡中打开 否则 如果存在于同一文件中 它将滚动到同一文件中不需要的定义
  • Foursquare API 用于解决场地用户图像错误

    Foursquare API 已将用户的照片标签分为前缀和后缀 但是 如果我将它们合并以形成完整的图像 URL 并将其粘贴到浏览器中 则会出现错误 提示图像无法显示 因为它包含错误 是服务器暂时不可用还是其他原因 我正在使用 API 获取场
  • 将 editorfor 转换为下拉列表时出现问题

    请在这里查看达林的解决方案 将 HTML EditorFor 转换为下拉列表 html dropdownfor https stackoverflow com questions 9517627 converting html editor
  • 为什么 TOP 或 SET ROWCOUNT 使我的查询如此慢?

    我有一个包含大约 1400 万行的 SQL Server 2008 数据库 里面有两张桌子 Table1 rowId int primary key someData1 int someData2 int Table2 id int pri
  • 有没有办法使用 CSS3 渐变并回退到 PNG?

    如何将 CSS3 渐变用于背景图像 并在不支持渐变的情况下回退到 PNG 图像 干得好 不支持 CSS3 渐变的浏览器将仅使用图像 div background color 1a82f7 fallback color background
  • javascript倒计时并显示毫秒

    我想要倒计时 并希望显示类似分钟 秒 毫秒的格式 我用jquery插件倒计时了倒数 http keith wood name countdown html但它只显示分钟 秒格式 有什么办法可以纠正吗 非常感谢 大家好 我已经为自己开发了一个
  • 使用 ruby​​ 流式传输并解压大型 csv 文件

    我遇到问题 需要下载 解压缩 然后逐行处理一个非常大的 CSV 文件 我认为让您了解文件有多大很有用 big file zip 700mb big file csv 23gb 这是我希望发生的一些事情 解压前不必下载整个文件 在解析 csv