SQLite バイナリ データ ダンプをメモリ内の読み取り専用データベース インスタンスにロードするにはどうすればよいですか?

概要

約 10MB の SQLite バイナリ ダンプがあります。ダンプされたデータベースにはカタログ データが含まれており、Ruby アプリケーションから非常に高速に (ミリ秒未満) 読み取ることができる必要があります。したがって、データダンプを SQLite のメモリ内の読み取り専用インスタンスにロードしようと考えていましたが、正確にどのようにすればよいのかわかりません。

私は次のようなことを試しましたが、データベースをメモリ内に保持しません。

require 'sqlite3'
require 'fileutils'

# Path to the binary database dump
binary_dump_path = 'path_to_your_binary_dump.db'

# Create a temporary file
temp_db_path = 'temp_database.db'
FileUtils.copy(binary_dump_path, temp_db_path)

# Open the temporary database
db = SQLite3::Database.new(temp_db_path)

# Optionally, set the database to read-only mode
db.execute('PRAGMA query_only = ON')

解決策

SQLite3::Backup クラスを使用してソース データベースをメモリにコピーし、それを使用できます。

# Load source DB
src_db = SQLite3::Database.new('source.db')

# Create destination memory DB 
mem_db = SQLite3::Database.new(':memory:')

# Copy the source DB into the the memory DB
backup = SQLite3::Backup.new(mem_db, 'main', src_db, 'main')
backup.step(-1)
backup.finish

# Do your work on the memory DB
mem_db.execute('SELECT ...') { |row|
  ...
}