[groonga-dev,01144] Re: 特定条件にマッチするレコードの一括削除

アーカイブの一覧に戻る

ongaeshi ongae****@gmail*****
2012年 12月 23日 (日) 16:54:21 JST


ongaeshiです。

うまくいきました!

===========================
1. 結果

rroonga-2.0.6 + groonga-2.0.7 をmilkodeに追加 : 19222レコード

今までの削除方法 : 7m 54.26s
新しい削除方法   :    21.46sec

かなり早くなりました :-)

===========================
2. コード

教えてもらった方法を参考にしながら以下のようにしました。

今までの削除方法

def remove_match_path(path)
  records = search(:paths => [path])

  records.each do |record|
    yield record if block_given?
    record.key.delete
  end
end

新しい削除方法

def remove_match_path(path)
  records = search(:paths => [path])

  Groonga::Schema.define do |schema|
    schema.change_table("terms") do |table|
      table.remove_index("documents.path")
      table.remove_index("documents.package")
      table.remove_index("documents.restpath")
      table.remove_index("documents.content")
      table.remove_index("documents.suffix")
    end
  end

  records.each do |record|
    yield record if block_given?
    record.key.delete
  end

  Groonga::Schema.define do |schema|
    schema.change_table("terms") do |table|
      table.index("documents.path", :with_position => true)
      table.index("documents.package", :with_position => true)
      table.index("documents.restpath", :with_position => true)
      table.index("documents.content", :with_position => true)
      table.index("documents.suffix", :with_position => true)
    end
  end
end

===========================
3. サンプルとの相違

* table_change -> change_table
* add_index    -> index

であっているでしょうか?

===========================

ありがとうございました!



2012年12月22日 1:00 ongaeshi <ongae****@gmail*****>:

> ongaeshiです。
>
> ありがとうございます。
> 試してみます!
>
>
> 2012年12月20日 16:14 Kouhei Sutou <kou****@clear*****>:
>
> 須藤です。
>>
>> In <CA+vpKip4WwqgZG8ZD=NWfsd****@mail*****>
>>   "[groonga-dev,01140] Re: 特定条件にマッチするレコードの一括削除" on Thu, 20 Dec 2012
>> 10:59:50 +0900,
>>   ongaeshi <ongae****@gmail*****> wrote:
>>
>> >> > groonga 1.2.9リリース
>> >> > http://groonga.org/ja/blog/2011/12/29/release.html
>> >> >
>> >> > にて「レコードの一括削除に対応」というトピックを見つけました。
>> >> >
>> >> > 紹介されていた「特定条件にマッチするレコードの一括削除」を
>> >> > 【rroongaから】行うことは可能でしょうか?
>> >>
>> >> できません!
>> >>
>> >> なので、作ります!
>> >> ↓こんな感じのものを作ると思います。
>> >>
>> >>   table.delete do |record|
>> >>     # table.selectと同じように条件を指定する
>> >>   end
>> >>
>> >> Cレベルでカーソルを回すのでRubyレベルでループを回してレコー
>> >> ドを削除するよりも断然速くなると思います!
>> >>
>> >
>> > おお!ありがたいですー。
>> > 実装されるのを楽しみにしております。
>>
>> 実装して、速度を測ってみたら言うほど変わりませんでした!
>>
>> 対象:
>>   るりまのデータ 47634件
>> 削除するレコード数:
>>   24817件
>>
>> select結果をeachしてdeleteしたときの削除時間:
>>   約104秒
>>
>> deleteで条件をしてまとめて削除したときの削除時間:
>>   約95秒
>>
>> なので、別の方法のご提案です。
>> 削除前にインデックスを削除し、削除後にインデックスを再度追加
>> してください。こんな感じです。
>>
>>   needless_records = table.select {...}
>>   Groonga::Schema.define do |schema|
>>     schema.table_change("Lexicon") do |table|
>>       table.remove_index("...")
>>     end
>>     ...
>>   end
>>   needless_records.each do |record|
>>     record.key.delete
>>   end
>>   Groonga::Schema.define do |schema|
>>     schema.table_change("Lexicon") do |table|
>>       table.add_index("...")
>>     end
>>     ...
>>   end
>>
>> ↑のようにした時の削除時間(インデックスの再構築を含む):
>>   約4.4秒
>>
>>
>> ということで、レコード削除処理はインデックスからの削除に時間
>> がかかっているので、それを一時的に止めれば速くなります。
>>
>> ただし、deleteに条件を指定してまとめて削除する方法とインデッ
>> クスを一時的に止める方法は兼用できません。というのも、delete
>> 対象のレコードを捜すためにインデックスを使うため、インデック
>> スを削除してあると削除対象のレコードを見つけるのが遅くなった
>> り、見つけられなくなったりするからです。
>>
>>
>> 今回追加したdeleteでまとめて削除機能は便利なこともあると思う
>> ので残しておきます。
>>
>> --
>> 須藤 功平 <kou****@clear*****>
>> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)
>>
>> groongaサポート:
>>   http://groonga.org/ja/support/
>> パッチ採用はじめました:
>>   http://www.clear-code.com/recruitment/
>>
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>>
>
>
>
> --
> /******************************************
>  ongaeshi
>  MAIL:   ongae****@gmail*****
>  WEB:   http://ongaeshi.me
>  Twitter: http://twitter.com/ongaeshi
>  ******************************************/
>



-- 
/******************************************
 ongaeshi
 MAIL:   ongae****@gmail*****
 WEB:   http://ongaeshi.me
 Twitter: http://twitter.com/ongaeshi
 ******************************************/



groonga-dev メーリングリストの案内
アーカイブの一覧に戻る