diff options
Diffstat (limited to 'storage/mroonga/vendor/groonga/tools/check-small-index-limit.rb')
-rwxr-xr-x | storage/mroonga/vendor/groonga/tools/check-small-index-limit.rb | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/storage/mroonga/vendor/groonga/tools/check-small-index-limit.rb b/storage/mroonga/vendor/groonga/tools/check-small-index-limit.rb new file mode 100755 index 00000000000..d943d89e5ef --- /dev/null +++ b/storage/mroonga/vendor/groonga/tools/check-small-index-limit.rb @@ -0,0 +1,123 @@ +#!/usr/bin/env ruby + +# Groonga: 70dc95ef3b6fed1225981d099a65dcb7297248c5 +# +# N segments N chunks N patterns N records +# 1 1 2 50 +# 2 2 2 18898 +# 4 4 2 31181 +# 8 8 2 57853 +# 16 16 2 91349 +# 32 32 2 178502 +# 64 64 2 475020 +# 128 128 2 1066081 +# 256 256 2 2250389 +# 512 512 2 4648072 +# nil nil 1 16779239 +# nil nil 2 4648063 +# nil nil 4 7239005 +# nil nil 8 8308626 +# nil nil 16 11068608 +# nil nil 32 12670806 +# nil nil 64 18524231 +# nil nil 128 38095525 +# nil nil 256 51265415 + +require "fileutils" +require "json" + +def check_max_index(options) + max_n_segments = options[:max_n_segments] + max_n_chunks = options[:max_n_chunks] + n_patterns = options[:n_patterns] || 2 + + ENV["GRN_II_MAX_N_SEGMENTS_SMALL"] = max_n_segments&.to_s + ENV["GRN_II_MAX_N_CHUNKS_SMALL"] = max_n_chunks&.to_s + + db_dir = "/dev/shm/db" + log_path = "#{db_dir}/log" + FileUtils.rm_rf(db_dir) + FileUtils.mkdir_p(db_dir) + command_line = [ + "groonga", + "--log-path", log_path, + "-n", "#{db_dir}/db", + ] + IO.popen(command_line, "r+") do |groonga| + groonga.puts("table_create x TABLE_HASH_KEY UInt32") + groonga.gets + groonga.puts("column_create x y COLUMN_SCALAR UInt32") + groonga.gets + groonga.puts("table_create a TABLE_PAT_KEY UInt32") + groonga.gets + groonga.puts("column_create a b COLUMN_INDEX|INDEX_SMALL x y") + groonga.gets + + groonga.puts("load --table x") + groonga.puts("[") + File.open(log_path) do |log| + log.seek(0, IO::SEEK_END) + log_size = log.size + i = 0 + catch do |abort| + loop do + y = i + 1 + n_patterns.times do + groonga.print(JSON.generate({"_key" => i, "y" => y})) + groonga.puts(",") + groonga.flush + i += 1 + if log.size != log_size + data = log.read + if /\|[Ae]\|/ =~ data + parameters = [ + max_n_segments.inspect, + max_n_chunks.inspect, + n_patterns.inspect, + i, + ] + puts(parameters.join("\t")) + # puts(data) + throw(abort) + end + log_size = log.size + end + end + end + end + end + groonga.puts("]") + load_response = groonga.gets + # puts(load_response) + + groonga.puts("quit") + groonga.gets + end +end + +puts("N segments\tN chunks\tN patterns\tN records") +[ + [1, 1, 2], + [2, 2, 2], + [4, 4, 2], + [8, 8, 2], + [16, 16, 2], + [32, 32, 2], + [64, 64, 2], + [128, 128, 2], + [256, 256, 2], + [512, 512, 2], + [nil, nil, 1], + [nil, nil, 2], + [nil, nil, 4], + [nil, nil, 8], + [nil, nil, 16], + [nil, nil, 32], + [nil, nil, 64], + [nil, nil, 128], + [nil, nil, 256], +].each do |max_n_segments, max_n_chunks, n_parameters| + check_max_index(:max_n_segments => max_n_segments, + :max_n_chunks => max_n_chunks, + :n_patterns => n_parameters) +end |