【问题标题】:Stream to a file in ruby when exporting a large database table to a csv file将大型数据库表导出到 csv 文件时,流式传输到 ruby​​ 中的文件
【发布时间】:2013-07-15 02:02:26
【问题描述】:

我使用一个小的 ruby​​ 脚本和 mysql2 gem 从 mysql 数据库导出以下内容

require 'csv'
require 'mysql2'

begin
    db = Mysql2::Client.new( :host => ".", :username => "xyz", :password => 'xyz', :database => 'xyz')

    results = db.query 'select * from mytable'

    CSV.open("C:/tmp/mytable.csv", "w") do |csv|
        csv << results.fields

        results.each do |row|
            csv << row.values
        end
    end
end

这适用于小桌子,但我认为我应该为大桌子做不同的事情。我在这里可能是错的,但它似乎将整个表格读入内存,然后一口气将其全部写入。如果我有一个包含数千万行的大表,我想不断地流式传输到文件中。

我该怎么做呢?

我尝试在一个有大约 1000 万行的表上运行它并得到以下结果

[FATAL] failed to allocate memory

我找到了this,如果成功了会反馈的

result = client.query("SELECT * FROM really_big_Table", :stream => true)

【问题讨论】:

  • 是从数据库读取的问题,还是写入 CSV 文件的问题,或两者兼而有之?
  • 好问题,我早上去看看

标签: ruby csv file-io mysql2


【解决方案1】:

答案确实是这样,问题是读取数据库表

results = db.query( 'select * from mytable',  :stream => true, :cache_rows => false )

csv 的写入是异步完成的

【讨论】:

    【解决方案2】:

    这可能不是您正在寻找的 Ruby 解决方案,但它是一个解决方案:

    MySQL 支持直接输出到 CSV 文件。在您的情况下,如果您只需要一个 CSV 转储,那么最有效的方法可能是运行这样的查询:

    SELECT * FROM mytable
      INTO OUTFILE 'C:\\tmp\\mytable.csv'
      FIELDS TERMINATED BY ','
      ENCLOSED BY '"'
      LINES TERMINATED BY '\r\n'
    

    如果 MySQL 服务器与输出文件在同一台计算机上,这将有效,因为它将是写入文件的服务器,而不是客户端。

    http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

    【讨论】:

    • 不错的解决方案,但不幸的是我正在远程工作到服务器并且没有直接访问权限,只有登录
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2023-03-10
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多