質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

3470閲覧

Railsでメモリを解放する方法

kuuritar

総合スコア38

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/01/28 19:24

現在railsで以下のようなバッチプログラムを使っていますが、メモリ使用量が多いです。

  • データベースの数は1000ほど
  • データベース文ループし、各データベースのデータを全て取得してcsvに書き出す

悩んでいる点としては、ループが進むほどメモリを圧迫していっている点です。
一つ前のループでのデータは不要なのでメモリに持っておく必要はないのですが、どうも自動でメモリから解放してくれないようです。

ここを参考に色々試してみたのですが、解放されてないっぽいです。
他の記事も調べましたが、解放を考えるより.all等を使わず.selectを使い使用するメモリを減らすような記事が多かったです。

現状メモリの容量内に収まっているので大丈夫ですが、今後を考えると改善しておきたいです。
皆様の知恵をお貸し下さい。

参考までに以下のようなコードです。(サンプルです)

ruby

1# ここで全てのDBの名前を取得しています 2db_names = db_names 3 4db_names.each do |db_name| 5 # ここでDBを切り替えています 6 DatabaseChange(db_name) do 7 Article.export_csv 8 end 9end

ruby

1def export_csv 2 # 実際にはもっと複雑な取得処理ですが割愛しています 3 articles = Article.all 4 # 以後export処理 5end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

データベースの数は1000ほど

1つ考えられる可能性として、「1000個のデータベースに対して、接続が開放されずに残っている」ということがあります。

DatabaseChangeの中身がわからないのでなんともいえませんが、データベースを使い終わったときにきちんと切断できているか確認が必要ではないかと思います。

投稿2019/01/28 22:31

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuuritar

2019/01/28 22:38

なるほど。ありがとうございます。 こちらコネクションが残っているかどうか確認する方法はありますでしょうか? ちなみにDBの変更はapartmentのgemを利用して、Apartment::Tenant.switch!を使って変更しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問