Allow loading the DB without loading the merge bounds.

There are so many that it's a waste of memory and time to load those if they are not needed.
This commit is contained in:
Jirka Sejkora 2021-02-21 00:01:38 +01:00
parent 012b079e46
commit c6676c6681
6 changed files with 20 additions and 7 deletions

View file

@ -8,7 +8,7 @@ mod db;
mod combine; mod combine;
fn main() { fn main() {
let mut db = SqliteLayoutDB::from_file("layouts.sqlite").expect("Failed to load the DB"); let mut db = SqliteLayoutDB::from_file("layouts.sqlite", true).expect("Failed to load the DB");
eprintln!("Loaded the DB, {} stored layouts", db.layouts().len()); eprintln!("Loaded the DB, {} stored layouts", db.layouts().len());
let city = City::read_from_file("01.in", city::INPUT_CITY_WIDTH, city::INPUT_CITY_HEIGHT); let city = City::read_from_file("01.in", city::INPUT_CITY_WIDTH, city::INPUT_CITY_HEIGHT);

View file

@ -5,6 +5,7 @@ use std::collections::HashMap;
pub struct SqliteLayoutDB { pub struct SqliteLayoutDB {
connection: Connection, connection: Connection,
memory_db: MemoryLayoutDB, memory_db: MemoryLayoutDB,
bounds_accessible: bool
} }
pub struct MemoryLayoutDB { pub struct MemoryLayoutDB {
@ -135,7 +136,7 @@ impl LayoutDB for SqliteLayoutDB {
} }
impl SqliteLayoutDB { impl SqliteLayoutDB {
pub fn from_file(filename: &str) -> Result<Self> { pub fn from_file(filename: &str, read_bounds: bool) -> Result<Self> {
let connection = Connection::open(filename)?; let connection = Connection::open(filename)?;
let mut layouts: HashMap<u32, Vec<(u32, u32)>> = HashMap::new(); let mut layouts: HashMap<u32, Vec<(u32, u32)>> = HashMap::new();
@ -153,6 +154,7 @@ impl SqliteLayoutDB {
} }
let mut merges = HashMap::new(); let mut merges = HashMap::new();
if read_bounds
{ {
let mut stmt = connection.prepare("SELECT left_layout_id, right_layout_id, axis, price FROM merge_lower_bounds")?; let mut stmt = connection.prepare("SELECT left_layout_id, right_layout_id, axis, price FROM merge_lower_bounds")?;
let mut rows = stmt.query(NO_PARAMS)?; let mut rows = stmt.query(NO_PARAMS)?;
@ -169,6 +171,8 @@ impl SqliteLayoutDB {
price, price,
}); });
} }
} else {
} }
let layouts = layouts.into_iter().map(|(id, xy_pairs)| let layouts = layouts.into_iter().map(|(id, xy_pairs)|
@ -180,7 +184,7 @@ impl SqliteLayoutDB {
).collect(); ).collect();
let memory_db = MemoryLayoutDB::from_collections(layouts, merges); let memory_db = MemoryLayoutDB::from_collections(layouts, merges);
Ok(SqliteLayoutDB { connection, memory_db}) Ok(SqliteLayoutDB { connection, memory_db, bounds_accessible: read_bounds})
} }
pub fn memory_db(&self) -> &MemoryLayoutDB { pub fn memory_db(&self) -> &MemoryLayoutDB {
@ -206,10 +210,16 @@ impl SqliteLayoutDB {
} }
pub fn get_merge_lower_bound(&self, left_layout: &SavedLayout, right_layout: &SavedLayout, y_axis: bool) -> Option<u32> { pub fn get_merge_lower_bound(&self, left_layout: &SavedLayout, right_layout: &SavedLayout, y_axis: bool) -> Option<u32> {
if !self.bounds_accessible {
panic!("Bounds are not loaded!")
}
self.memory_db.get_merge_lower_bound(left_layout, right_layout, y_axis) self.memory_db.get_merge_lower_bound(left_layout, right_layout, y_axis)
} }
pub fn add_merge_lower_bound(&mut self, lower_bound: MergeLowerBound) -> Result<()> { pub fn add_merge_lower_bound(&mut self, lower_bound: MergeLowerBound) -> Result<()> {
if !self.bounds_accessible {
panic!("Bounds are not loaded!")
}
let transaction = self.connection.transaction()?; let transaction = self.connection.transaction()?;
transaction.execute("INSERT INTO merge_lower_bounds (left_layout_id, right_layout_id, axis, price) VALUES (?1, ?2, ?3, ?4) ON CONFLICT(left_layout_id, right_layout_id) DO UPDATE SET price = ?4", transaction.execute("INSERT INTO merge_lower_bounds (left_layout_id, right_layout_id, axis, price) VALUES (?1, ?2, ?3, ?4) ON CONFLICT(left_layout_id, right_layout_id) DO UPDATE SET price = ?4",
params![lower_bound.left_layout_id as u32, params![lower_bound.left_layout_id as u32,
@ -224,6 +234,9 @@ impl SqliteLayoutDB {
} }
pub fn add_merge_lower_bounds(&mut self, lower_bounds: Vec<MergeLowerBound>) -> Result<()> { pub fn add_merge_lower_bounds(&mut self, lower_bounds: Vec<MergeLowerBound>) -> Result<()> {
if !self.bounds_accessible {
panic!("Bounds are not loaded!")
}
let transaction = self.connection.transaction()?; let transaction = self.connection.transaction()?;
for lower_bound in &lower_bounds { for lower_bound in &lower_bounds {
transaction.execute("INSERT INTO merge_lower_bounds (left_layout_id, right_layout_id, axis, price) VALUES (?1, ?2, ?3, ?4) ON CONFLICT(left_layout_id, right_layout_id, axis) DO UPDATE SET price = ?4", transaction.execute("INSERT INTO merge_lower_bounds (left_layout_id, right_layout_id, axis, price) VALUES (?1, ?2, ?3, ?4) ON CONFLICT(left_layout_id, right_layout_id, axis) DO UPDATE SET price = ?4",

View file

@ -14,7 +14,7 @@ enum State {
} }
fn main() { fn main() {
let mut db = SqliteLayoutDB::from_file("layouts.sqlite").expect("Failed to load the DB"); let mut db = SqliteLayoutDB::from_file("layouts.sqlite", false).expect("Failed to load the DB");
let stdin = io::stdin(); let stdin = io::stdin();
let price_regex = Regex::new("^Price ([0-9]*), seed ([0-9]*)$").unwrap(); let price_regex = Regex::new("^Price ([0-9]*), seed ([0-9]*)$").unwrap();

View file

@ -19,7 +19,7 @@ enum RunType {
} }
fn main() { fn main() {
let mut db = SqliteLayoutDB::from_file("layouts.sqlite").expect("Failed to load the DB"); let mut db = SqliteLayoutDB::from_file("layouts.sqlite", false).expect("Failed to load the DB");
eprintln!("Loaded the DB, {} stored layouts", db.layouts().len()); eprintln!("Loaded the DB, {} stored layouts", db.layouts().len());
let city = City::read_from_file("01.in", city::INPUT_CITY_WIDTH, city::INPUT_CITY_HEIGHT); let city = City::read_from_file("01.in", city::INPUT_CITY_WIDTH, city::INPUT_CITY_HEIGHT);

View file

@ -13,7 +13,7 @@ mod optimization;
mod population; mod population;
fn main() { fn main() {
let mut sqlite_db = SqliteLayoutDB::from_file("layouts.sqlite").expect("Failed to load the DB"); let mut sqlite_db = SqliteLayoutDB::from_file("layouts.sqlite", false).expect("Failed to load the DB");
eprintln!("Loaded the DB, {} stored layouts", sqlite_db.layouts().len()); eprintln!("Loaded the DB, {} stored layouts", sqlite_db.layouts().len());
let city = City::read_from_file("01.in", city::INPUT_CITY_WIDTH, city::INPUT_CITY_HEIGHT); let city = City::read_from_file("01.in", city::INPUT_CITY_WIDTH, city::INPUT_CITY_HEIGHT);

View file

@ -23,7 +23,7 @@ fn main() {
} }
}; };
let db = SqliteLayoutDB::from_file("layouts.sqlite").expect("Failed to load the DB"); let db = SqliteLayoutDB::from_file("layouts.sqlite", false).expect("Failed to load the DB");
eprintln!("Loaded the DB, {} stored layouts", db.layouts().len()); eprintln!("Loaded the DB, {} stored layouts", db.layouts().len());
let city = City::read_from_file("01.in", city::INPUT_CITY_WIDTH, city::INPUT_CITY_HEIGHT); let city = City::read_from_file("01.in", city::INPUT_CITY_WIDTH, city::INPUT_CITY_HEIGHT);