xodus записать производительность с параллельными потоками? - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь использовать 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?Я не видел ни форума, ни чего-либо другого.

1 Ответ

0 голосов
/ 06 июня 2018

Параллельная запись в одну среду всегда конкурирует, даже если записанные данные кажутся полностью отделенными (несвязанными).Существует два способа уменьшения конкуренции:

  1. Расположите записи по порядку, используя метод executeInExclusiveTransaction вместо executeInTransaction.Этот подход организует не только пользовательские транзакции, но и фоновые транзакции GC.Недостатком является то, что он также заказывает подготовительную работу для записей (определенных в лямбда-выражениях, передаваемых методу), которые, вероятно, могут выполняться параллельно.
  2. Разделить одну среду на несколько.Если данные, записанные одновременно, действительно не связаны (то есть, по крайней мере, не требуют определенной согласованности), они могут быть сохранены в разных транзакциях в разных средах.Записывайте баланс общего кеша хорошо с сотнями сред, созданных в одной JVM, если вы не определите exodus.log.cache.shared=false.Кроме того, разные среды могут быть физически изолированы на разных устройствах хранения.
...