Лучшая практика для создания общей библиотеки, заполненной большими данными

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

Данные представляют собой один большой массив, содержащий более миллиона элементов.

Я хочу, чтобы установка / удаление библиотеки была максимально простой. Библиотека может быть ссылкой на другие интерфейсные программы, такие как Терминальная программа, R-программа и т. Д. Она должна поддерживать только UNIX

У меня была одна идея — жестко закодировать данные в один большой массив и скомпилировать файл в библиотеку, но, похоже, это не правильный и не эффективный способ сделать что-то. Кроме того, если я сделаю файл размером более 1 ГБ, то thigs выйдет из-под контроля.

Еще я должен был скопировать файл с данными в предопределенный путь и жестко закодировать ссылку в библиотеке на этот путь. Однако некоторые пользователи не хотят устанавливать все по пути установки по умолчанию.

У меня была еще одна идея — предоставить каждому интерфейсу возможность указывать путь к файлу данных, но для интерфейса это создает трудности, и зачем интерфейсу знать, где находятся данные библиотеки?

Есть ли какая-нибудь хорошо знакомая практика для такого случая?

1

Решение

Я не думаю, что есть один «правильный» ответ на это.

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

Наличие вторичного файла полезно только в том случае, если вы ожидаете, что данные будут меняться чаще, чем вы хотите выпустить новую общую библиотеку. Это добавляет дополнительные сложности при открытии и чтении вторичного файла — недостатком является то, что вам также необходимо добавить проверку того, что он корректен / присутствует, и кода, имеющего дело с ним, там нет.

Если у вас есть вторичный файл, определенно будет полезно иметь НЕКОТОРЫЙ способ переопределения местоположения.

Если данные действительно большие, вы можете использовать сжатый формат. Вы по-прежнему можете хранить сжатые данные в виде данных в вашей общей библиотеке и использовать библиотеку сжатия, которая может расширить данные из этого. Или вы можете использовать библиотеку, которая читает из внешнего файла …

В конце концов, это действительно сводится к:

  1. Как вы используете данные — вам всегда нужно ВСЕ из них, или вам просто нужно иногда это делать? Если последнее, как вы узнаете, какие биты?
  2. Как часто данные меняются.
  3. Если данные могут быть сжаты или нет, и если да, то каким способом вы их сжимаете?

Я не уверен, что существуют какие-либо прямые ограничения на размер разделяемой библиотеки — если вам нужен 1 ГБ данных, то вам нужно 1 ГБ пространства в памяти в любом случае, так что вы не экономите память [предполагается, что вам всегда нужны ВСЕ данные и / или не могу определить, какие детали вам нужны].

2

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

Вы можете использовать тестовый файл и сохранять в нем данные в сжатом двоичном формате. затем распространяем текстовый файл и dll / lib вместе

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector