Как я могу сохранить большой объект Perl для повторного использования между запусками? - PullRequest
4 голосов
/ 25 мая 2010

У меня большой XML-файл, который занимает более 40 секунд для анализа с XML :: Simple .

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

Я смотрел на использование Data :: Dumper , но в документации немного не хватает того, как сохранять и извлекать свои выходные данные из файлов на диске. Другие классы, на которые я смотрел (например, Cache :: Cache , предназначены для хранения множества мелких объектов, а не одного большого.

Кто-нибудь может порекомендовать модуль, предназначенный для этого?

EDIT . Файл XML ftp: //ftp.rfc-editor.org/in-notes/rfc-index.xml, и я добавил Storable для ускорения последующих запусков. Изменение парсера XML потребовало бы очень значительных изменений кода.

На моих тестах Mac Pro для чтения всего файла с помощью XML :: Simple против Сохраняемость :

      s/iter  test1  test2
test1   47.8     --  -100%
test2  0.148 32185%     --

Ответы [ 2 ]

11 голосов
/ 25 мая 2010

Data :: Dumper на самом деле ОЧЕНЬ просто. Если ваш объект является хеш-кодом $HashRef:

# Write
open(FILE, ">your_filename") || die "Can not open: $!";
print FILE Data::Dumper->Dump([$HashRef],["HashRef"]);
close(FILE) || die "Error closing file: $!";

# Read
my $HashRef;
$HashRef = eval { do "your_filename" };
   # Might need "no strict;" before and "use strict;" after "do"
die "Error reading: $@" if $@;
# Now $HashRef is what it was before writing

Другим хорошим вариантом является использование Storable . Из POD:

use Storable;
store \%table, 'file';
$hashref = retrieve('file');

Очень хорошее руководство по различным вариантам (а также лучший пример использования Data :: Dumper) см. Глава 14 «Постоянство» книги Брайана Д. Фоя «Mastering Perl»

5 голосов
/ 25 мая 2010

Storable . Это ленивый ответ. ( Предпочитайте nstore, а не магазин. )

Противоположность сброса данных: eval.

Хороший ответ: вы действительно хотите научиться использовать модуль XML, подходящий для интенсивной обработки, такой как XML :: Twig или XML :: LibXML для ускорения синтаксического анализа, так что вам не нужен этот кеширующий код обезьяны.

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