我们正在我们刚刚构建的 CMS 中构建 CSV 导出机制,但我们无法在包含数百万行的结果集上保持内存不足。将 1MM+ 行结果从 MySQL(通过mysql2
gem)写入 CSV 的最佳方法是什么。如果有什么不同的话,我们使用的是 Ruby 1.9.3p194 和 MySQL 5.5。我们的主要目标是减少 Ruby 进程的内存消耗。
问问题
2637 次
3 回答
7
默认情况下,mysql2 缓存它为其结果集创建的 ruby 对象。如果你关闭它,那么内存消耗应该会大大减少。例如你可能会做
require 'mysql2'
client = Mysql2::Client.new(:host => "localhost", :username => "someuser")
client.query 'use some_db'
CSV.open('output.csv', 'w') do |csv|
results = client.query("SELECT * FROM big_table")
results.each(:cache_rows => false) do |row|
csv << [row['column_a'], row['column_b']]
end
end
于 2012-07-01T15:56:00.517 回答
4
于 2012-06-30T00:38:37.360 回答
0
如果您出于某种原因不想使用 eggyal 的解决方案,我会使用andOUTFILE
将查询分成批次:LIMIT
OFFSET
SELECT ... LIMIT 5000 OFFSET 5000
http://dev.mysql.com/doc/refman/5.0/en/select.html
内存消耗将来自于从 1M+ 的大查询创建一个大的单个 ruby 数组。通过将其拆分为更小的批次并将每个批次依次转储到 CSV 文件中,将有助于降低内存消耗。
于 2012-06-30T00:48:24.753 回答