Быстрая бинарная альтернатива базы данных
Я хочу реализовать быструю альтернативу базам данных, которая должна обрабатывать только двоичные данные. Чтобы указать, я хочу что-то рядом с базой данных, которая будет надежно храниться даже в случае принудительного завершения (диспетчер задач) во время выполнения, а также доступ непосредственно из памяти в C++. Как вектор структур, который отражается на жестком диске. Он должен иметь возможность обрабатывать сотни тысяч обращений к чтению и не менее 1000 обращений к записи в секунду. В случае принудительного завершения, самое большее последняя команда может быть потеряна. Он не должен поддерживать многопоточность, и файл базы данных будет доступен только одному экземпляру программы. Нужно только запустить на Windows. Вот решения, о которых я думал до сих пор:
Базы данных SQL
- преимущества
- Простота реализации, так как доступно много библиотек
- Недостатки
- Сервер находится в другом процессе, поэтому возможно медленное взаимодействие между процессами
- Необходимость разбора SQL-запросов.
- Создан для многопоточных сред, поэтому много ненужной синхронизации
- К строкам нельзя получить прямой доступ с помощью указателей, но их необходимо копировать как минимум дважды за изменение
- Ненужные задержки в запросе UPDATE, так как нужно искать всю таблицу и проверять регистр WHERE
- Это было всего лишь несколько из головы, может быть, гораздо больше
- преимущества
Файлы, отображенные в память
- преимущества
- Прямое отображение памяти, так что прямой доступ к указателю возможен
- Очень быстро по сравнению с базами данных
- Недостатки
- Принудительное завершение может привести к тому, что вся страница не будет записана
- Много кода (на самом деле я не против)
- Принудительная синхронизация невозможна
- Увеличение размера файла может занять много времени
- преимущества
- C++ вектор *
- преимущества
- Прямой доступ к указателю возможен, однако, необходимо вручную уведомлять об изменениях
- Очень быстро по сравнению с базами данных
- Полная свобода программирования
- Недостатки
- Возможно, медленно из-за большого количества обращений к WriteFile
- Много кода (на самом деле я не против)
- преимущества
- C++ вектор с полной записью каждые несколько секунд
- преимущества
- Возможен прямой доступ к указателю
- Очень быстро по сравнению с базами данных
- Полная свобода программирования
- Недостатки
- Много неизмененных данных перезаписывается в файл, или много памяти тратится на предотвращение ненужных записей
- Недоступность во время записи большого количества оперативной памяти при копировании
- Может потерять данные за несколько секунд
- Несколько потоков и для этого необходима синхронизация
- преимущества
* По сути, класс-оболочка, который предоставляет только для каждой строки функции чтения / записи вектора ИЛИ, позволяет прямую запись в память, но полагается на вызывающую функцию для уведомления об изменениях, все чтения выполняются из копии в памяти, все записи выполняются в копия в памяти и сам файл для каждой команды
Кроме того, возможно ли записать в разные части файла без очистки, а затем сбросить все изменения сразу с гарантией того, что файл будет записан полностью или не записан вообще, даже в случае принудительного завершения во время записи? Все, что я могу думать, это следующий рабочий процесс:
Дублировать целевой файл при запуске, а затем для каждого набора данных: записать все изменения в дубликат -> очистить, заменив оригинал дубликатом
Тем не менее, я чувствую, что это было бы ужасной тратой дискового пространства для больших файлов.
Спасибо заранее за любые данные!