流在红宝石文件导出一个大的数据库表到一个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)
答
答案确实是这样,这个问题是读取数据库表
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
是从数据库中读取的问题,或写入CSV文件还是两者? – sawa
好问题,我会在早上检查 – Neil