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
******************************************/