RDF.rb は、Rubyで書かれたRDF解析ライブラリで、Ruby界隈でのセマンティックWebやLinked Data処理用途で広く使われている。
RDF.rbの2022年8月時点での最新版は 3.2.9 だが、このバージョンには、昨年2021年時点で使っていた3.1系列に比べて、かなり性能上の劣化があるようなので、念のためメモを残しておく。
例えば、以下のようなコードを実行した場合、数万トリプル規模のファイルの場合には数秒で終わるのが、数十万トリプルを超えた場合に、急速に遅くなる現象が発生する。
require "rdf/n3"
graph = RDF::Graph.new
RDF::N3::Reader.open("test.n3") do |reader|
count = 0
reader.each_statement do |statement|
graph.insert << statement
count += 1
end
end
上記のコードは単に、test.n3
というRDF/N3形式のファイルを読み込みながら、graph
変数にトリプルを格納しなおしているだけのコードである。
ベンチマークのために、SP2Benchと呼ばれるRDFベンチマーク用のツールを使って自動生成した、1万トリプル、10万トリプル、20万トリプル、100万トリプルの各RDFデータファイルに対して実行した場合の性能比較を行ってみた結果が以下となる。
$ ./benchmark.rb "~> 3.1.0"
RDF::VERSION: 3.1.15
RDF::N3::VERSION: 3.1.2
user system total real
test10k.n3 3.049624 0.069207 3.118831 ( 3.119040)
test100k.n3 33.302798 0.159743 33.462541 ( 33.463206)
test200k.n3 84.753375 0.290011 85.043386 ( 85.045089)
test1000k.n3 805.143489 2.719901 807.863390 (807.891563)
$ ./benchmark.rb "~> 3.2.0"
RDF::VERSION: 3.2.9
RDF::N3::VERSION: 3.2.1
user system total real
test10k.n3 3.084775 0.021109 3.105884 ( 3.106361)
test100k.n3 40.841392 0.279945 41.121337 ( 41.124899)
test200k.n3 183.223961 0.829992 184.053953 (184.062652)
test1000k.n3 11218.755949 15.469557 11234.225506 (11234.622095)
まず、RDF.rb 3.1.15 での結果をみると、1万トリプルで3秒が、100万トリプルが800秒となる等、やや時間がかかっているとはいえ、おおむね線形の実行時間となっている。
一方、RDF.rb 3.2.9 では、1万トリプルでは3.1系と変わらないものの、10万トリプル・20万トリプルと少しずつ実行が3.1系より遅くなっている。さらに、100万トリプルのデータでは、3時間以上と相当に実行時間を要する結果となっている。
なお、上記の実行環境は Windows11 の WSL2 (Ubuntu) において構築した Ruby 3.1.2p20 を使って確認した。
実行に使ったスクリプトは以下にあるものです: https://gist.github.com/masao/398d9009cd8ba78d9da9283c8038c27d
また、使ったデータは以下にも置いておきます: https://www.dropbox.com/sh/kwndqqddj1jfz8l/AABcE0ssvYkl0EO5Vm5gtw-_a?dl=0