Я пытаюсь использовать xodus в качестве хранилища, потому что я хочу хранилище такого типа, и тесты делают его быстрым.
Однако на практике записи выглядят действительномедленный.
Я настраиваю два магазина с шаблоном, подобным этому:
environment = Environments.newInstance(xodusDBFolder);
Store initialStateStore = environment.computeInTransaction(new TransactionalComputable<Store>()
{
@Override
public Store compute(@NotNull final Transaction txn)
{
return environment.openStore("initialStateStore", StoreConfig.WITHOUT_DUPLICATES, txn);
}
});
Затем я пишу с шаблоном, подобным этому:
environment.executeInTransaction((Transaction txn) -> {
ArrayByteIterable key = IntegerBinding.intToEntry(c.getNid());
ByteIterable oldValue = store.get(txn, key);
ArrayByteIterable value;
if (oldValue != null)
{
//merge contents...
}
....
value = new ArrayByteIterable(rawData);
store.put(txn, key, value);
});
Подача данныхв этом шаблоне у меня есть несколько потоков, каждое из которых считывает и анализирует данные - по 1 для каждой среды, которую я заполняю.
Я ожидал, что мое чтение / синтаксический анализ обнаружит узкое место ... но на практике узкое место этов записи xodus.
Я думал, что могу записать xodus параллельно, поэтому я делал записи в пуле потоков - но это ухудшило производительность.На сегодняшний день лучшая производительность, кажется, достигается, когда я отключаю сборщик мусора и разрешаю только 1 потоку писать в хранилище xodus.
Я что-то не так делаю?С одним потоком медленная часть - это все, что происходит ниже ReadWriteTransaction.doCommit ().С несколькими потоками все они просто блокируют и ждут ReentrantTransactionDispatcher.waitForPermits ().
Я мог бы, вероятно, использовать две разные среды, которые, вероятно, помогли бы на половину ...., но мне просто кажется, что что-тоСовершенно неправильно, если у меня не может быть двух потоков, одновременно пишущих несвязанные ключи для xodus, без их соперничества.
В качестве примечания, лучше ли говорить об использовании xodus?Я не видел ни форума, ни чего-либо другого.