読者です 読者をやめる 読者になる 読者になる

opKdtPluginで大量のテスト用データを生成したときの覚え書き

めもめも。

まず、そもそもどういふ状況の話かといふと「テスト用にメンバー情報を300,000件用意するのでopKdtPluginで生成しまくる」といふやうな感じです。

とりあへず、これをそのまま

$ ./symfony opKdt:generate-member --number=300000

とか実行しようとしてもダメなのです。メモリ食ひまくって自滅します。生成する件数が少ないときは数千件ごとに分けて実行すればいいですが、今回はさすがにその方法は面倒なので却下。

で、このメモリリークの原因を調べたところ、↓の2つだった。どちらも件数が増えるごとにメモリ使用量が右肩上がり。

  • sfDoctrineConnectionProfiler (sfDoctrinePluginでデフォルト有効。今回は要らない)
  • MemberConfigTable (自前でモデルをキャッシュしようとして参照握りっぱなし)

んで、原因が分かった所でどこを修正するか。まずプロファイラは使用しないので config/databases.yml をサクッと修正。これでプロファイラは使用されなくなる。

all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=hogehoge;host=localhost'
      username: root
      encoding: utf8
      attributes: { 164: true }
      profiler: false  # ←ここ!

この方法はopKdtPlugin以外でも opOpenSocial:execute-lifecycle-event などの大量のレコードを処理するタスクでもかなり効果があります。たぶん。

次は MemberConfigTable。OpenPNE3 Core側を修正するのは面倒なので今回はパス。修正内容は下記URLを参照して下さい。

https://github.com/kawahara/opKdtPlugin/commit/ab4ea10



・・・かうして、心置きなく大量のダミーデータを生成することができるやうになった。

ちなみに修正後は、生成するデータ件数に関はらずピーク時のメモリ使用量が 33MB ほどになりました。修正前は 2,000 件生成で 184MB くらゐ使ってゐた (しかも件数とともに増加) のでかなりの改善。よかったよかった。