我正在尝试使用 Rust 从多个线程写入单个数据库,我需要将大量行写入数据库,因此使用单个线程,该过程非常慢(30 分钟或更长),因为这是为了测试我决定添加更多线程,问题是它似乎并没有使进程的速度提高很多。
关于如何在 Rust 上正确执行此操作有什么建议吗?这是我现在拥有的代码,我正在考虑管理重试,因为有时线程会恐慌,因为它们发现数据库已锁定,这超出了这个具体问题,但如果您也想提供帮助,无论如何都会受到赞赏:
#[cfg(test)]
mod tests {
use std::{sync::{atomic::{AtomicU32, Ordering}, Arc}, thread, time};
use common::store::StoreConnection;
use reports::bat_osc::BatOscData;
const TEST_DB: &str = "/tmp/test_database.db";
fn write_entries(count: &AtomicU32) {
while count.load(Ordering::Relaxed) < 7000000 {
if count.load(Ordering::Relaxed) % 1000 == 0 {
println!("{}", count.load(Ordering::Relaxed));
}
let store = StoreConnection::new(TEST_DB, reports::bat_osc::BAT_OSC_TABLE)
.unwrap()
.writer(2592000 * 2)
.unwrap();
let data = BatOscData {
..Default::default()
};
let _ = store.insert(data);
count.fetch_add(1, Ordering::Relaxed);
}
}
#[test]
fn write_a_lot() {
let count = Arc::new(AtomicU32::new(0));
let mut handles = vec![];
// Create several threads
for _ in 0..1000 {
let count_clone = Arc::clone(&count);
let handle = thread::spawn(move || {
write_entries(&count_clone);
});
handles.push(handle);
}
// Join all the threads
for handle in handles {
handle.join().expect("Thread panicked");
}
}
}
尝试使用多个线程写入数据库以提高进程速度。速度根本没有增加。
使用批处理可以大大提高性能,但多线程没有,如果有人需要实现相同的效果,我最终遵循了本指南:https://avi.im/blag/2021/fast-sqlite-inserts/