Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Индексация данных


Автор: 21:80 24.9.2005, 16:14
Ребята, задача такова:
Есть текстовый файлик ~12 метров. В нем храняться данные в виде:

<имя_раздела1>
ключ11=значение11
ключ12=значение12

<имя_раздела2>
ключ21=значение21
ключ22=значение22

<имя_раздела3>
ключ31=значение31
ключ32=значение32

... ... ...

Таких записей в файлике около миллиона.
Имена разделов могут быть произвольные, но уникальные! Количество пар ключ-значение неограничено, но имя ключа уникально в данном разделе.
Задача: необходимо проидексировать все имена разделов, чтобы знать в каком месте файла находится раздел, т.е. запомнить номера строк на которых находится заголовок раздела. После индексации необходимо совершать быстый переход к заголовку раздела. Важно, что при следующем открытии файлика не должна производится повторная индексация, т.е. её данные надо сохранять, например в другой файлик.

Если кто даст ссылочку на пагез где можно четко почитать про индексацию - клёво, ну а если прямо на ПЕРЛАХ наваяете - ваще отпад!

Заранее благодарен ]Ж-)))

Автор: sharq 24.9.2005, 19:19
21:80 для таких целей используют БД.

smile

Автор: 21:80 24.9.2005, 19:42
sharq я понимаю, дело только в том, что файлик есть, значит надо :-)) Да, кстати важное замечание количество пар ключ-значение в каждом разделе разное и никак с положением раздела не связано :-)) Думаем господа!

Автор: sharq 25.9.2005, 01:43
21:80 есть такая идея отпарсить файлик и привязать имени раздела номер строки, это соответствие хранить в хеше, который можно дампить Storable'ом. При внесение новой записи в файлик или при его изменение, редактировать хеш.

smile

Автор: 21:80 27.9.2005, 00:28
sharq расскажи про Storable подробнее, пожалуйста. Че ето такое и как пользоваться. А парсер уже написан, только для "разчленения" такого гиганта (12 Мб если позабыл), на 4 пне 2Гб мозгов надо около 5 сек, причем проц под завязку загружен - проблема.

Жду твоего ответа с нетерпением :-))

Автор: sharq 27.9.2005, 23:21
21:80
Код

#(c)j256
#Как получить бинарный дамп хеша или массива на Perl
  use Storable;
#Запись/чтение дампа в файл.
   store (\%table, 'file');  $hashref = retrieve('file');
   lock_store (\%table, 'file');  $hashref = lock_retrieve('file');
#Запись/чтение дампа в ранее открытый файл.
   store_fd (\%table, \*FILE); $hashref = fd_retrieve(\*FILE);
#Запись/чтение дампа в скалярную переменную
#(удобно для использования для привязки сложной структуры к ключу в DB_File или BerkeleyDB).
   $hash_dump = freeze (\%table); $hash_ref = thaw($hash_dump);

#Если нужно получить дамп в символьном "perl sources"-виде для использования в eval или print: use Data::Dumper;


Storable - позволяет дампить perl-структуры данных в файле и восстанавливать их, очень удобная вещь.)
Например, ты работаешь с хешем, затем взял и сохранил его в сторабле, затем когда тебе нужно восстановил его или взял из него инфу или изменил его и переписал заново. Причем простым редактором содержимое сторабла не прочитаешь. Так что пользуйся.

smile
Добавлено @ 23:22

Если те нужен алгоритм твоей задачи, это уже совсем другой вопрос.)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)