流在红宝石文件导出一个大的数据库表到一个CSV文件时

问题描述:

使用一个小Ruby脚本和mysql2宝石我出口从MySQL数据库以下流在红宝石文件导出一个大的数据库表到一个CSV文件时

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 

这工作适合于小表,但我认为我应该为大桌子做不同的事情。我可能在这里是错误的,但它似乎将整个表读出到记忆中,然后一次写完。如果我有一张拥有数千万行的巨大表格,我想不断流向该文件。

我该怎么做呢?

我试着用约10万行运行这对一个表,并得到了以下

[FATAL] failed to allocate memory 

我发现this,如果它的工作原理

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

是从数据库中读取的问题,或写入CSV文件还是两者? – sawa

+0

好问题,我会在早上检查 – Neil

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

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

的CSV的写作做异步

这将报到不是您正在寻找的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/

+0

很好的解决方案,但不幸的是我正在远程服务于服务器,没有直接访问,只有登录 – Neil