mariadb/storage/mroonga/vendor/groonga/tools/check-small-index-limit.rb

123 lines
2.9 KiB
Ruby
Executable file

#!/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