Быстрая бинарная альтернатива базы данных

Я хочу реализовать быструю альтернативу базам данных, которая должна обрабатывать только двоичные данные.
Чтобы указать, я хочу что-то рядом с базой данных, которая будет надежно храниться даже в случае принудительного завершения (диспетчер задач) во время выполнения, а также доступ непосредственно из памяти в C ++. Как вектор структур, который отражается на жестком диске. Он должен иметь возможность обрабатывать сотни тысяч обращений к чтению и не менее 1000 обращений к записи в секунду. В случае принудительного завершения, самое большее последняя команда может быть потеряна. Он не должен поддерживать многопоточность, и файл базы данных будет доступен только одному экземпляру программы. Нужно только запустить на Windows. Вот решения, о которых я думал до сих пор:

  1. Базы данных SQL

    • преимущества
      • Простота реализации, так как доступно много библиотек
    • Недостатки
      • Сервер находится в другом процессе, поэтому возможно медленное взаимодействие между процессами
      • Необходимость разбора SQL-запросов.
      • Создан для многопоточных сред, поэтому много ненужной синхронизации
      • К строкам нельзя получить прямой доступ с помощью указателей, но их необходимо копировать как минимум дважды за изменение
      • Ненужные задержки в запросе UPDATE, так как нужно искать всю таблицу и проверять регистр WHERE
      • Это было всего лишь несколько из головы, может быть, гораздо больше
  2. Файлы, отображенные в память

    • преимущества
      • Прямое отображение памяти, так что прямой доступ к указателю возможен
      • Очень быстро по сравнению с базами данных
    • Недостатки
      • Принудительное завершение может привести к тому, что вся страница не будет записана
      • Много кода (на самом деле я не против)
      • Принудительная синхронизация невозможна
      • Увеличение размера файла может занять много времени
  3. C ++ вектор *
    • преимущества
      • Прямой доступ к указателю возможен, однако, необходимо вручную уведомлять об изменениях
      • Очень быстро по сравнению с базами данных
      • Полная свобода программирования
    • Недостатки
      • Возможно, медленно из-за большого количества обращений к WriteFile
      • Много кода (на самом деле я не против)
  4. C ++ вектор с полной записью каждые несколько секунд
    • преимущества
      • Возможен прямой доступ к указателю
      • Очень быстро по сравнению с базами данных
      • Полная свобода программирования
    • Недостатки
      • Много неизмененных данных перезаписывается в файл, или много памяти тратится на предотвращение ненужных записей
      • Недоступность во время записи большого количества оперативной памяти при копировании
      • Может потерять данные за несколько секунд
      • Несколько потоков и для этого необходима синхронизация

* По сути, класс-оболочка, который предоставляет только для каждой строки функции чтения / записи вектора ИЛИ, позволяет прямую запись в память, но полагается на вызывающую функцию для уведомления об изменениях, все чтения выполняются из копии в памяти, все записи выполняются в копия в памяти и сам файл для каждой команды

Кроме того, возможно ли записать в разные части файла без очистки, а затем сбросить все изменения сразу с гарантией того, что файл будет записан полностью или не записан вообще, даже в случае принудительного завершения во время записи? Все, что я могу думать, это следующий рабочий процесс:

Дублируйте целевой файл при запуске, затем для каждого набора данных:
Запишите все изменения в дубликат -> Очистить, заменив оригинал дубликатом

Тем не менее, я чувствую, что это было бы ужасной тратой дискового пространства для больших файлов.

Спасибо заранее за любые данные!

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]