ищу легкое решение для сохранения данных в Perl - PullRequest
10 голосов
/ 21 июня 2010

В моем приложении мне нужно хранить простые данные как в памяти, так и на диске.В моем случае реальная база данных будет излишней, поэтому мне нужна более легкая, чтобы справиться с простым требованием к сохранению данных.Я сам выполнил поиск в Google и нашел что-то интересное, например, DBM и DBI CVS и т. Д., Но поскольку там слишком много вариантов, мне сложно сделать актуальный выбор, поэтому я бы хотел попросить вас здесь«Лучшая практика», как облегченное решение для определения перистабильности данных в Perl.

Ответы [ 6 ]

15 голосов
/ 21 июня 2010

У вас есть несколько вариантов:

  • Storable является основным модулем и очень эффективен. Это , поскольку некоторые проблемы с переносимостью , например, кто-то, использующий более старую версию Storable, может не прочитать ваши данные. Кроме того, очень важна процедура создания и извлечения этих данных. Параметры загрузки сетевых заказов помогают уменьшить проблемы переносимости. Вы можете сохранить произвольную вложенную структуру данных в файл или строку и восстановить ее. Сохраняемость поддерживается только Perl.

  • YAML - это текстовый формат, который работает как хранимый - вы можете хранить и восстанавливать произвольные структуры в / из файлов YAML. YAML хорош, потому что есть библиотеки YAML для нескольких языков. Это не так быстро и не так эффективно, как Storable.

  • JSON - это популярный формат обмена данными с поддержкой многих языков. По своим сильным и слабым сторонам он очень похож на YAML.

  • DBD :: SQLite - это драйвер базы данных для DBI, который позволяет хранить всю реляционную базу данных в одном файле. Он мощный и позволяет вам работать со многими инструментами персистентности, предназначенными для других баз данных, таких как MySQL и Postgres.

  • DBM :: Deep - это удобный и мощный модуль только для Perl, который позволяет эффективно извлекать и модифицировать небольшие части больших постоянных структур данных. Почти такой же простой в использовании, как и Storable, но гораздо более эффективный при работе только с небольшими частями большой структуры данных.

Обновление: Я понял, что должен упомянуть, что я использовал все эти модули и, в зависимости от ваших конкретных потребностей, любой из них может быть "правильным выбором".

7 голосов
/ 21 июня 2010

Возможно, вы захотите попробовать Tie :: Storable . Тогда это так же просто, как обратиться к хешу.

Если вы не хотите хранить тонну данных и у вас все в порядке, загружая все сразу при запуске программы, это может быть путь.

Если вы ищете что-то более сложное, но все же легкий, многие люди (включая меня) клянутся SQLite .

3 голосов
/ 21 июня 2010

Если бы мне пришлось это сделать, я бы, вероятно, пошел с DBI и DBD :: SQLite, поскольку он не включает считывание всех данных в память, но я бы хотел упомянуть еще несколько способов, потому что «есть больше чем один способ сделать это ":

Старый способ сделать это был с DB_file и его двоюродными братьями. Это все еще работает с современными версиями Perl. Недостатком является то, что он полезен только для хранения одномерного хеша (хеш, в котором нет ссылок). Преимущество состоит в том, что вы можете найти хорошие книги об этом, которые не стоят очень больших денег, а также статьи в Интернете, а также я считаю, что это не предполагает считывание всего файла в память.

Другой способ - распечатать содержимое Data::Dumper в файл для хранения и eval содержимое файла для чтения данных.

Еще одна вещь, которая не была упомянута, это KiokuDB, которая выглядит как ультрасовременный модуль на основе Moose, если вы хотите быть модным.

2 голосов
/ 08 февраля 2011

Хотите ли вы, чтобы ваши данные прозрачно сохранялись, то есть вам не нужно было беспокоиться о выполнении операции типа commit () после каждой записи?Я только что задал очень похожий вопрос: Простое, современное, надежное и прозрачное постоянство структур данных для Perl , и перечислил все найденные решения.

Если вы хотите прозрачное сохранение (автокоммит), тогда 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';
}    
1 голос
/ 21 июня 2010

Посмотрите на Tie::File и подмодули, такие как Tie::File::AsHash или Tie::Handle::CSV.Все доступно на CPAN, быстро и легко.

0 голосов
/ 21 июня 2010

Storable позволяет сериализовать любую структуру данных Perl и считывать ее обратно. Для хранения в памяти просто используйте IO :: Scalar для хранения в строку, таким образом, вам нужно только написать кододин раз и для записи на диск вы просто передаете другой дескриптор ввода / вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...