3

我们正在我们刚刚构建的 CMS 中构建 CSV 导出机制,但我们无法在包含数百万行的结果集上保持内存不足。将 1MM+ 行结果从 MySQL(通过mysql2gem)写入 CSV 的最佳方法是什么。如果有什么不同的话,我们使用的是 Ruby 1.9.3p194 和 MySQL 5.5。我们的主要目标是减少 Ruby 进程的内存消耗。

4

3 回答 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

SELECT ... INTO OUTFILEmysqldump

于 2012-06-30T00:38:37.360 回答
0

如果您出于某种原因不想使用 eggyal 的解决方案,我会使用andOUTFILE将查询分成批次:LIMITOFFSET

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 回答