Можно ли одновременно записывать данные в один и тот же файл набора данных, но в разные именованные графы (каждый поток записывает в разные именованные графы)?
В TDB Йены кажется, что данные организованы "набором данных" (указанным каталогом), который может содержать несколько "именованных графов".
Что касается политики параллелизма для запроса таких данных, единственная документация, которую я нашел касательно параллелизма, - это следующее предложение из документации TDB, API-интерфейс TDB Java:
Для параллельного доступа можно действовать напрямую с набором данных без транзакций с политикой Multiple Reader или Single Writer (MRSW).
Однако я не уверен в степени детализации такой политики MRSW. Это весь набор данных или отдельный граф с именем из набора данных?
РЕДАКТИРОВАТЬ: Более конкретно, мое требование заключается в том, чтобы я хотел делать обновления только для записи для разных именованных графов (каждый поток записывает в разные именованные графы) без какой-либо операции чтения, возможно ли это? Или я должен позволить одному обновлению потока за один раз.
3 ответа
Учитывая, что в связанной документации написано
Для параллельного доступа можно действовать напрямую с набором данных без транзакций с политикой Multiple Reader или Single Writer (MRSW).
Я ожидаю, что если у вас есть несколько писателей, которые будут иметь доступ к набору данных, даже если в разных именованных графах, вы должны использовать транзакции. В документации по транзакциям TDB говорится о транзакциях записи:
Общий шаблон:
dataset.begin(ReadWrite.WRITE) ; try { ... dataset.commit() ; } finally { dataset.end() ; }
и эти призывы к begin
а также end
связаны с набором данных, а не с отдельными именованными графами.
Многие тройные хранилища (и я думаю, что TDB включен в это) рассматривают тройки в именованных графах как четырехкратные (часто просто называемые четырехугольниками). Тройной a b c
в названном графе g1
может храниться вместе с тройной d e f
в названном графе g2
в той же четверной таблице:
g1 a b c
g2 d e f
и затем эта четырехугольная таблица, представляющая один набор данных, может быть проиндексирована в любом из четырех столбцов. В этом представлении часть данных с именованным графом на самом деле ничем не отличается от остальных данных, поэтому именованные графы не обеспечивают никакой изоляции от проблем параллелизма. Действительно, поскольку в общем случае запросы и обновления SPARQL могут считывать или обновлять несколько именованных графов, невозможно заранее узнать именованные графы, к которым будет обращаться запрос или обновление.
Видимо можно написать следующий код:
ХОРОШО. Видимо можно написать следующий код:
Dataset dataset = TDBFactory.createDataset("demo");
Model model = dataset.getNamedModel("aModel");
try {
model.enterCriticalSection(False); //Write Lock
// write triples to model
model.commit();
TDB.sync(model);
} finally {
model.leaveCriticalSection();
}
В соответствии с этим, я думаю, что не должно быть никаких проблем с одновременной записью в разные именованные графы. Это все еще не проверено все же.
Не безопасно писать в два графика в одном и том же наборе данных одновременно.
Может показаться, что работает без транзакций, но это потенциально небезопасно. Код может обнаружить это и предупредить, но это гарантировано.
Вы должны использовать транзакции.
Когда два писателя пытаются записать, нет истинной параллельной записи (есть внутренняя блокировка, чтобы сохранить все в безопасности).
Если вы хотите сделать акцент на записи, подумайте о наличии двух наборов данных, а затем создайте универсальный набор (структура в памяти) с моделями из каждого отдельного набора данных.
На практике истинные параллельные записывающие устройства могут не дать вам больших преимуществ по сравнению с транзакциями записи в одну и ту же базу данных, если на обычных серверах с одним диском имеется только один путь к диску. CPU+RAM не является ограничением.