Я пытаюсь писать в одной базе данных из нескольких потоков, используя 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");
}
}
}
Пытаюсь записать в базу данных несколько потоков, чтобы увеличить скорость процесса. Скорость вообще не увеличивается.
Какую БД вы используете?
Я использую sqlite3, попробую использовать пакеты и повторно использовать соединение и посмотреть, решит ли это проблему, спасибо

Использование пакетов значительно улучшило производительность, а многопоточность - нет. Если кому-то нужно реализовать то же самое, я в конечном итоге следовал этому руководству: https://avi.im/blag/2021/fast-sqlite-inserts/
Кажется, вы создаете новое подключение к БД 7000000 раз. Вы должны оставить открытым только одно соединение и использовать его повторно. И вместо того, чтобы вставлять данные по отдельности, вам, вероятно, следует подготовить пакет среднего размера и отправить его в транзакции (не так часто). Тысячи потоков не помогут, потому что ваша система не будет планировать их очень часто, и они просто перегрузят сервер БД (или файловую систему, если это что-то вроде sqlite) одновременными запросами.