Я создал динамическую библиотеку C ++, которая зависит от 30 или более мегабайт данных. Теперь я пытаюсь выяснить, как лучше хранить эти данные.
Данные представляют собой один большой массив, содержащий более миллиона элементов.
Я хочу, чтобы установка / удаление библиотеки была максимально простой. Библиотека может быть ссылкой на другие интерфейсные программы, такие как Терминальная программа, R-программа и т. Д. Она должна поддерживать только UNIX
У меня была одна идея — жестко закодировать данные в один большой массив и скомпилировать файл в библиотеку, но, похоже, это не правильный и не эффективный способ сделать что-то. Кроме того, если я сделаю файл размером более 1 ГБ, то thigs выйдет из-под контроля.
Еще я должен был скопировать файл с данными в предопределенный путь и жестко закодировать ссылку в библиотеке на этот путь. Однако некоторые пользователи не хотят устанавливать все по пути установки по умолчанию.
У меня была еще одна идея — предоставить каждому интерфейсу возможность указывать путь к файлу данных, но для интерфейса это создает трудности, и зачем интерфейсу знать, где находятся данные библиотеки?
Есть ли какая-нибудь хорошо знакомая практика для такого случая?
Я не думаю, что есть один «правильный» ответ на это.
Хранение данных в файле — это хорошо, если данные не меняются чаще, чем вы хотите выпустить новую библиотеку — вам так или иначе нужен объем хранилища, так что компилятор этого не делает. проделайте ужасную работу с хранением данных в общей библиотеке, насколько я вижу, это не хуже, чем любые другие варианты.
Наличие вторичного файла полезно только в том случае, если вы ожидаете, что данные будут меняться чаще, чем вы хотите выпустить новую общую библиотеку. Это добавляет дополнительные сложности при открытии и чтении вторичного файла — недостатком является то, что вам также необходимо добавить проверку того, что он корректен / присутствует, и кода, имеющего дело с ним, там нет.
Если у вас есть вторичный файл, определенно будет полезно иметь НЕКОТОРЫЙ способ переопределения местоположения.
Если данные действительно большие, вы можете использовать сжатый формат. Вы по-прежнему можете хранить сжатые данные в виде данных в вашей общей библиотеке и использовать библиотеку сжатия, которая может расширить данные из этого. Или вы можете использовать библиотеку, которая читает из внешнего файла …
В конце концов, это действительно сводится к:
Я не уверен, что существуют какие-либо прямые ограничения на размер разделяемой библиотеки — если вам нужен 1 ГБ данных, то вам нужно 1 ГБ пространства в памяти в любом случае, так что вы не экономите память [предполагается, что вам всегда нужны ВСЕ данные и / или не могу определить, какие детали вам нужны].
Вы можете использовать тестовый файл и сохранять в нем данные в сжатом двоичном формате. затем распространяем текстовый файл и dll / lib вместе