ruby pg prepareでのメモリーリーク対策
作成:2018-08-29 更新:2018-08-29ruby pg 使用時のprepareでのメモリーリーク
かなり以前から使ってるrubyで記述したプログラムが out of memory で停止するように2018年8月下旬からなった。
環境
- OS Debian 9.4
- ruby 2.3.3
- pg 0.18.4
- postgresql 9.6.10
実行中の様子をtopで見ていると、みるみるmemory free 次にswap freeが減っていき遂に両方0になってしまいました。
対策
exec_preparedの結果rsを使用終了後、下の例のようにrs.clearする。
#!/usr/bin/ruby
require 'pg'
rowID = 9
begin
con = PG.connect :dbname => 'testdb', :user => 'henohenomoheji'
con.prepare 'stm1', "SELECT * FROM player WHERE Id=$1"
rs = con.exec_prepared 'stm1', [rowId]
puts rs.values
rescue PG::Error => e
puts e.message
ensure
rs.clear if rs
con.close if con
実際プログラムでは、loop内でexec_prepareしていました。