2013-05-01 2 views
3

C++ Я хотел бы использовать некоторые крошечные C++ Library в моем коде, который позволил бы сделать что-то вроде:библиотека хранения данных для

DataStore ds; 
ds.open("data.bin"); 
int num=5; 
std::string str="some text"; 
ds.put("key1",num); 
ds.put("key2",str); 
ds.get("key1");// returns int(5) 
ds.get("key2");// returns std::string("some text") 

стиль использования не должен быть такой же, как код пример, но принцип должен оставаться (получить/установить значение любого типа и сохранить его в файле blob). Библиотека также не должна быть основанной на SQL, и не быть оболочкой SQL. Что такое такие библиотеки и каковы их преимущества?

РЕДАКТИРОВАТЬ: не более 10 тыс. Ключей, с ок. 100 байт данных на ключ, файл не должен быть переносимым между компьютерами или ОС, файл не должен редактироваться с помощью текстового редактора (он выглядит более профессиональным, если это не так) и не должен быть многопоточным.

+0

Есть десятки или более проектов «ini library». Даже если ни одно из этих объектов не так просто, как ваше описание для использования, создание такого объекта над ними обязательно будет тривиальным. – mah

+0

@mah вы правы, но мне не нравится хранить данные в файле INI, я думаю, что это не очень профессионально ... – 2013-05-01 11:01:34

+0

Это большое пространство. Ответ зависит от некоторых вопросов. У вас есть 1000, 1000000 или 100000000 ключей? Должен ли файл переноситься между машинами? Нужен ли файл для редактирования в текстовом редакторе?Необходимо ли одновременное обращение к файлу несколькими процессами? –

ответ

4

Один из вариантов для вас использовать BerkeleyDB и ее C API, C++ API или C++ STL API:

BekeleyDB имеет небольшой размер, быстрый, зрелый и надежный. Еще одним преимуществом BerkeleyDB является то, что большинство языков сценариев, таких как Python, Perl и т. Д., Привязаны к нему, поэтому вы можете манипулировать (просматривать, визуализировать) данные с ними.

Недостаток заключается в том, что все, что вы можете сохранить в нем, это пара ключ-значение, где ключ и значение являются строками (или, скорее, блобами), поэтому вам нужно преобразовать из типов данных C++ в строки/капли.

+0

ОК, будет использовать эту БД ... – 2013-05-01 12:38:35

+1

Хорошо, удачи. Спасибо за редактирование, я не знал о третьем API. – piokuc

1

Нетрудно создать класс, который будет выполнять то, что вы описываете основным способом. Все, что вам нужно, это некоторые функции, которые могут читать/писать ключи, тег для «какого типа это» (возможно, в сочетании с размером хранимых данных, если мы предполагаем, что хранящиеся данные не являются огромными), и я имею в виду несколько MB за элемент или около того]. Вы можете найти какую-то «структуру индекса» или «где следующий элемент».

Существует небольшая проблема с отображением вашего ds.get(std::string): вы фактически не можете вернуть int и std::string с той же функцией. Вы можете написать функцию, которая принимает std::string в качестве ссылки, а другая, которая принимает int в качестве ссылки, или некоторые из них.

Это становится более интересным, если вам нужно иметь много ключей - на данный момент вам, возможно, понадобится какая-то организация хеширования или двоичного дерева для поиска по клавишам. Ключи 10k, вероятно, не очень важны - если вы храните их в отсортированном порядке, вам становится легче.

файл не должен быть редактируемым с текстовым редактором (он выглядит более профессионально, если это не)

Я должен сказать, что я не согласен с этим. Я считаю, что редактируемые тексты файлов ОЧЕНЬ профессионально выглядят. Тот факт, что он является двоичным, просто делает вещи неудобными и сложнее справиться, если что-то в приложении не работает по вашему желанию (например, он сохранил путь установки, вы его перенесли, и он больше не работает, и поскольку вы не можете запустите его, это не позволит вам отредактировать эту конфигурацию).

+0

ОК, в некоторых случаях вы правы с «редактируемой» частью, но у меня есть и другие причины не использовать легко редактируемые файлы ... – 2013-05-01 12:40:57

+0

+1 для рекомендации текстовых файлов. –

Смежные вопросы