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 сравниваются с локальной базой данных (без сетевых издержек), поэтому, если вы используете удаленный протокол, ожидайте некоторые задержки.
Как указал Криштян, повторно используйте объекты, если это возможно.