OrientDB медленная запись

Официальный сайт OrientDB говорит:

В обычных магазинах аппаратного обеспечения до 150 000 документов в секунду 10 миллиарды документов в день. Большие графики загружаются в несколько миллисекунды, не выполняя дорогостоящего JOIN, такого как Relational СУБД.

Но выполнение следующего кода показывает, что он принимает ~ 17000ms для вставки 150000 простых документов.

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.record.impl.ODocument;

public final class OrientDBTrial {

    public static void main(String[] args) {
        ODatabaseDocumentTx db = new ODatabaseDocumentTx("remote:localhost/foo");
        try {
            db.open("admin", "admin");

            long a = System.currentTimeMillis();
            for (int i = 1; i < 150000; ++i) {
                final ODocument foo = new ODocument("Foo");
                foo.field("code", i);
                foo.save();
            }
            long b = System.currentTimeMillis();
            System.out.println(b - a + "ms");

            for (ODocument doc : db.browseClass("Foo")) {
                doc.delete();
            }
        } finally {
            db.close();
        }
    }

}

Мое оборудование:

  • Dell Optiplex 780
  • Intel (R) Core (TM) 2 Duo CPU E7500 @2.93Ghz
  • ОЗУ 8 ГБ
  • Windows 7 64bits

Что я делаю неправильно?

Разделение сохранений в 10 параллельных потоках для минимизации накладных расходов Java запустило его в ~ 13000 мс. Все еще намного медленнее, чем говорит первая страница OrientDB.

Ответ 1

Вы можете добиться этого, используя "Flat Database" и orientdb как встроенную библиотеку в java подробнее см. здесь http://code.google.com/p/orient/wiki/JavaAPI

то, что вы используете, - это режим сервера, и он отправляет много запросов на сервер orientdb, судя по вашему эталону, вы получили ~ 10 000 вставок в секунду, что неплохо, например, я думаю, что 10 000 запросов/с - очень хорошая производительность для любого веб-сервера (и сервер orientdb на самом деле является веб-сервером, и вы можете запросить его через http, но я думаю, что java использует двоичный режим)

Ответ 2

Сначала прочтите документацию о том, как добиться максимальной производительности!

Несколько советов:

НЕ выполнять экземпляр ODocument:

  final ODocument doc;
  for (...) {
    doc.reset();
    doc.setClassName("Class");
    // Put data to fields
    doc.save();
  }

НЕ полагайтесь на System.currentTimeMillis() - используйте perf4j или аналогичный инструмент для измерения времени, потому что первый из них измеряет глобальные системные времена, следовательно, включает время выполнения всех других программ, запущенных на вашем система!

Ответ 3

Цифры с сайта OrientDB сравниваются с локальной базой данных (без сетевых издержек), поэтому, если вы используете удаленный протокол, ожидайте некоторые задержки.

Как указал Криштян, повторно используйте объекты, если это возможно.