В моем приложении мне нужно хранить некоторые простые данные как в memroy, так и на диске. В моем случае реальная база данных будет излишней, поэтому мне нужен более легкий, чтобы справляться с простым требованием сохранения данных. Я сам делаю поиск по Google, и нашел что-то интересное, например, DBM и DBI CVS и т.д., Но так как там слишком много вариантов, поэтому мне сложно сделать выбор actuaaly, поэтому я хотел бы попросить вас здесь "лучшая практика", например, решение о переносимости данных веса в perl.
Ищет облегченное решение для сохранения данных в perl
Ответ 1
У вас есть несколько вариантов:
-
Storable является основным модулем и очень эффективен. Это h как некоторые проблемы с переносимостью, например, кто-то, использующий более старую версию Storable, может не прочитать ваши данные. Кроме того, важна сущность системы, создающая и извлекающая эти данные. Расширенные опции сетевого порядка помогают снизить проблемы с переносимостью. Вы можете сохранить произвольную вложенную структуру данных в файл или строку и восстановить ее. Storable поддерживается только Perl.
-
YAML - текстовый формат, который работает как сохраняемый - вы можете хранить и восстанавливать произвольные структуры в/из YAML файлы. YAML хорош, потому что есть библиотеки YAML для нескольких языков. Это не так быстро или экономично, как Storable.
-
JSON - популярный формат обмена данными с поддержкой на многих языках. Это очень похоже на YAML в его сильных и слабых сторонах.
-
DBD:: SQLite - это драйвер базы данных для DBI, который позволяет хранить всю реляционную базу данных в одном файле. Он мощный и позволяет работать со многими инструментами персистентности, которые нацелены на другие базы данных, такие как MySQL и Postgres.
-
DBM:: Deep - это удобный и мощный модуль perl, который позволяет эффективно извлекать и модифицировать небольшие части большого постоянного структуры данных. Почти такой же простой в использовании, как Storable, но гораздо эффективнее при работе с небольшими частями большой структуры данных.
Обновление: Я понял, что должен упомянуть, что я использовал все эти модули, и в зависимости от ваших конкретных потребностей любой из них может быть "правильным выбором".
Ответ 2
Возможно, вы захотите попробовать Tie:: Storable. Тогда это так же просто, как обращение к хешу.
Если вы не хотите хранить тонну данных, и вы нормально загружаете все сразу при запуске программы, возможно, это будет путь.
Если вы ищете что-то более сложное, но все же легкое, многие люди (включая меня) клянутся SQLite.
Ответ 3
Если бы мне пришлось это сделать, я бы, вероятно, пошел с DBI и DBD:: SQLite, так как это не связано с чтением всех данных в памяти, но я хотел бы упомянуть несколько других способов, потому что "там больше чем один способ сделать это":
Старый способ сделать это был с DB_file
и его кузенами. Он по-прежнему работает с современными версиями Perl. Недостатком является то, что он полезен только для хранения одномерного хэша (хеш, в котором нет ссылок). Преимущество в том, что вы можете найти хорошие книги об этом, которые не стоят очень больших денег, а также онлайн-статей, а также я считаю, что это не связано с чтением всего файла в память.
Другой метод - распечатать содержимое Data::Dumper
в файл для хранения и eval
содержимое файла для чтения данных.
Еще одна вещь, о которой не упоминалось, - KiokuDB
, которая выглядит как самый передовой модуль на основе Moose, если вы хотите быть модными.
Ответ 4
Вы хотите, чтобы ваши данные были прозрачно сохранены, т.е. вам не придется беспокоиться о выполнении операции commit() типа после каждой записи? Я просто задал очень похожий вопрос: Простая, современная, надежная, прозрачная персистентность данных для Perl и перечислены все найденные решения.
Если вам нужна прозрачная настойчивость (autocommit), то DBM::Deep может быть проще в использовании, чем Storable. Вот пример кода, который работает из коробки:
use DBM::Deep;
tie my %db, 'DBM::Deep', 'file.db';
if ( exists $db{foo}->{bar} ) {
print $db{foo}->{bar}, "\n"
} else {
$db{foo}->{bar} = 'baz';
}
Ответ 5
Посмотрите Tie::File
и подмодули вроде Tie::File::AsHash
или Tie::Handle::CSV
. Все доступные на CPAN, быстрая и простая в использовании.
Ответ 6
Storable позволяет сериализовать любую структуру данных Perl и читать ее обратно. Для хранения в памяти просто используйте IO:: Скаляр для хранения в строку, таким образом вам нужно только написать код один раз и для записи на диск, вы просто передаете другой дескриптор ввода-вывода.