Pull to refresh

Perst — высокопроизводительная ООБД

Reading time4 min
Views3.6K

Perst — An open source, object-oriented embedded database


Высокопроизводительная объектно-ориентированная встраиваемая база данных от компании McObject.

Поддерживаемые платформы

  • J2SE 1.4 and выше
  • Android (Open Handset Alliance)
  • J2ME MIDP 2.0/CLDC 1.1
  • .NET Framework (1.0, 2.0, 3.0, 3.5)
  • .NET Compact Framework (1.0, 2.0)
  • Mono

Основные возможности

  • Хранит данные непосредственно в объектах Java и .NET, исключая время на преобразование необходимое реляционным и объектно-ориентированным БД
  • Компактная (сборка для .NET весит всего чуть больше 500 кб)
  • Поддержка транзакций
  • Легко используемые инструменты разработки (ниже приведен код, по которому вы сможете это оценить)
  • Есть возможность использовать SQL-подобный язык запросов (для .NET 3.5 можно использовать LINQ)
  • Экспорт в XML
  • Репликация
  • Полнотекстовый индекс (скорость индексации конечно не сравниться со Sphinx или Lucene, но все же для некоторых задач сгодиться)
  • Шифрование базы при помощи алгоритма RC4
  • Быстрая система восстановление БД после сбоев (без использования log-файлов)
  • с остальными возможностями вы можете ознакомиться на странице спецификации Perst

Лицензия


Двойная: либо GNU General Public License version 2, либо если вас не устраивает GNU GPL v2 есть коммерческая.

Быстродействие


На официальном сайте выложены тесты от двух компаний PolePosition и TestIndex. PolePosition производит сравнение Perst с db4o, о которой не раз упоминали на Хабре. Результат, как вы наверно догадались, Perst быстрее. Такой же результат сообщает нам TestIndex, проводившая тестирование на эмуляторе Android и смартфоне T-Mobile G1 сравнивая Perst c SQLite. Pdf-ки с графиками можно скачать с официального сайта.

Пример на С#


Тут действительно все просто — все объеты (классы), которые необходимо хранить в базе данных Perst наследуются от класса Persistent. Создадим класс простой класс данных:
  1. /// <summary>
  2. /// Класс для хранения данных.
  3. /// </summary>
  4. class MyData : Persistent
  5. {
  6.  public int intKey;
  7.  public string strData;
  8. }
* This source code was highlighted with Source Code Highlighter.
Теперь нам необходимо создать класс который будет создавать нужные нам индексы, а также являться корневым элементом базы данных.
  1.  /// <summary>
  2.  /// Корневой элемент базы данных.
  3.  /// </summary>
  4.  class MyRoot : Persistent
  5.  {
  6.   /// <summary>
  7.   /// Индекс по полю intKey в класе MyData.
  8.   /// </summary>
  9.   public FieldIndex<int, MyData> intKeyIndex;
  10.  
  11.   public MyRoot(Storage db)
  12.    : base(db)
  13.   {
  14.    intKeyIndex = db.CreateFieldIndex<int, MyData>("intKey", false); // False обозначает неуникальность ключа.
  15.   }
  16.   public MyRoot()
  17.   {
  18.   }
  19.  }
* This source code was highlighted with Source Code Highlighter.
Ну, а теперь там осталось только подключиться к базе и работать с ней. Заодно проведем тестирование быстродействия.
  1. class Program
  2.  {
  3.   static void Main(string[] args)
  4.   {
  5.    DateTime t1;
  6.    DateTime t2;
  7.    Storage db = StorageFactory.Instance.CreateStorage();
  8.    MyRoot Root;
  9.    MyData Obj;
  10.    MyData[] ObjList;
  11.  
  12.    // Выделим Perst 10Мб оперативной памяти для работы с базой, что бы немного снизить нагрузки на диск и
  13.    // увеличить скорость.
  14.    db.Open("MyDB.pdb", 10 * 1024 * 1024, "My_SecreT_k3y");
  15.    // Если в базе еще нет корневого элемента, создадим его.
  16.    if (db.Root == null)
  17.    {
  18.     db.Root = new MyRoot(db);
  19.    }
  20.    Root = (MyRoot)db.Root;
  21.  
  22.    // Добавим объект MyData в базу.
  23.  
  24.    t1 = DateTime.Now;
  25.    for (int i = 0; i < 100000; i++)
  26.    {
  27.     Obj = new MyData();
  28.     Obj.intKey = i;
  29.     Obj.strData = "Привет, мир!!!";
  30.     Root.intKeyIndex.Put(Obj);
  31.    }
  32.    t2 = DateTime.Now;
  33.    Console.WriteLine((t2 - t1).TotalMilliseconds.ToString() + " ms");
  34.  
  35.    // Теперь попробуем его получить.
  36.    //Т.к. мы создали индекс с неуникальным ключом, то воcпользуемся перегруженой функцией Get(from, till).
  37.    ObjList = Root.intKeyIndex.Get(1000, 1000);
  38.    foreach (MyData Obj1 in ObjList)
  39.    {
  40.     Console.WriteLine(Obj1.strData);
  41.    }
  42.  
  43.    db.Close();
  44.   }
  45.  }
* This source code was highlighted with Source Code Highlighter.
На моем ноуте создание 100000 объектов выполняется за 2.4сек, т.е. ~42к записей в сек.

Вывод


Perst действительно быстрая и компактная ООБД, которая подойдет не только для вашего приложения для PC, но и для мобильных устройств.
Но можно ли ее применить на сайтах спросите вы? Ответ будет таков: в туториале заявлена поддержка мульти-клиентского приложения, используя для этого ThreadTransaction и свойство БД perst.multiclient.support, но мне так и не удалось добиться высокой производительности (10 потоков создают по 10 записей выполнялось 21сек). Скорее всего я что, то не так делаю?! В любом случае исходники я выложу, что вы смогли меня поправить и сами потестировать.

Ссылки

  1. Официальный сайт
  2. Страница загрузки
  3. Исходники примеров на VB.NET
  4. Исходники примеров на C#
Tags:
Hubs:
Total votes 32: ↑30 and ↓2+28
Comments62

Articles