2015-12-01 2 views
1

Вопрос в основном заключается в том, безопасно ли при параллельной обработке в R одновременное обращение нескольких потоков к базе данных SQLite.Несколько одновременных потоков с использованием SQLite в R

Я понимаю, что SQLite является файловым уровнем dbs, поэтому каждое соединение получает доступ ко всему db. Таким образом, одновременное одновременное подключение нескольких подключений (например, через интерфейс SQLite3 и R, через RSQLite dbConnect() и через src_sqlite() dplyr). Я предполагаю, что это нормально, пока есть один пользователь, который может заверить, что команды, представленные одним способом, завершены до отправки других команд.
Но при многопоточности может показаться возможным, что один поток может отправить команду SQLite db, в то время как команда, представленная другим потоком, может не завершиться.
Является ли базовый SQLite-механизм сериализацией полученных команд, чтобы гарантировать, что одна команда будет завершена до того, как будет обработана следующая команда, чтобы избежать создания несогласованного состояния базы данных?
Я прочитал документацию SQLite о блокировке и «ACID», и, насколько я понимаю, эта документация, ответ кажется «Да».
Но я хочу быть уверенным, что правильно понял вещи.

Другой вопрос: безопасно ли иметь отдельные потоки, отправляющие команды одновременно, которые фактически изменяют базу данных.
Поскольку невозможно контролировать точное время, в течение которого эти два потока отправляют свои команды, я предполагаю, что использование параллельных процессов, которые могли бы изменить таблицу данных SQLite несовместимым образом, не было бы хорошей идеей - например, с одним потоком вставьте запись в таблицу, а другой поток выполнит SELECT в той же таблице.

+1

R (по крайней мере, распределенные по CRAN-версии) однопоточные. Этот вопрос кажется бессвязным и чрезмерно широким для SO, который спрашивает, что вы задавали сосредоточенные вопросы о кодировании, поэтому вам, вероятно, следует искать ответы на форуме, который предназначен для обсуждения SQLite. –

+3

Есть R-пакеты, которые позволяют многопоточность (например, очистка данных в 'plyr'). Например, если кто-то хочет обрабатывать данные для 100 разных регионов, может иметь смысл, что они будут делать это в R с 4 потоками, чтобы сократить время выполнения примерно на 75%. Этот вопрос действительно является просто вопросом sqlite, но он по-прежнему имеет смысл с точки зрения программирования. Я думаю, что OP просто не знает, какие конфликты возникают из нескольких экземпляров чтения/записи в базу данных. –

+0

«Стена текста» совершенно нечитаема. –

ответ

3

Это нормально, если он читает базу данных, но запись в базу данных блокирует базу данных как минимум на несколько миллисекунд. Если вы пытаетесь прочитать во время записи (или писать во время написания), будет возвращена ошибка, которая может быть использована для определения того, следует ли повторить операцию чтения/записи. Если это относительно простой процесс, вы должны быть в порядке с sqlite3. Source

Смежные вопросы