構築したばかりのCMSでCSVエクスポートメカニズムを構築しており、数百万行の結果セットのメモリを抑えるのに問題があります。MySQLから(mysql2
gemを介して)1MM以上の行の結果をCSVに書き込むための最良の方法は何ですか。違いがあれば、Ruby1.9.3p194とMySQL5.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
OUTFILE
何らかの理由でeggyalのソリューションを使用したくない場合は、 LIMIT
andを使用してクエリをバッチに分割し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 に答える