Как я могу манипулировать локальной базой данных с помощью Perl?

Я программист Perl с несколькими хорошими сценариями, которые выбирают HTTP-страницы (из текстового файла-списка URL-адресов) с помощью cURL и сохраняют их в папку.

Однако количество страниц, которые нужно получить, исчисляется десятками миллионов. Иногда скрипт дает сбой на номере 170 000 и мне приходится заново запускать скрипт вручную. Он автоматически считывает URL-адрес и видит, загружена ли страница, и пропускает ее. Но с несколькими сотнями тысяч все еще требуется несколько часов, чтобы вернуться к тому месту, где он остановился. Очевидно, что в итоге это не сработает.

Мне сказали, что вместо сохранения в текстовый файл, который трудно найти и изменить, мне нужно использовать базу данных. Я не очень разбираюсь в базах данных, год назад просто возился с MySQL на школьном сервере. Мне просто нужна возможность добавлять миллионы строк и несколько статических столбцов, искать/изменять один быстро и делать все это локально в локальной сети (или на одном компьютере, если это сложно). И, конечно же, мне нужно получить доступ к этой базе данных с помощью perl.

С чего начать? Что мне нужно скачать, чтобы запустить сервер в Windows? Какие модули Perl следует использовать? (Я использую дистрибутив ActiveState)


person VolatileRig    schedule 26.09.2010    source источник


Ответы (3)


Поскольку вам нужно искать только в одном столбце, вы можете рассмотреть базу данных хранилища ключей/значений, например Berkeley DB с помощью BerkeleyDB или DB_File.

Как правило, вы можете думать об этих базах данных типа «ключ-значение» как о хэшах Perl, которые работают с диска, а не с памяти. Точный поиск ключей выполняется очень быстро. Все остальное требует сканирования всего набора данных.

person daotoad    schedule 26.09.2010
comment
Оказывается, мне нужно хранить более двух фрагментов данных для каждой строки, поэтому я не думаю, что это сработает так же хорошо, как SQLite, но я добавлю в закладки на потом, спасибо! - person VolatileRig; 27.09.2010
comment
Вы знаете, мне, возможно, придется использовать что-то подобное, чтобы узнать, есть ли у меня уже уникальный URL-адрес в моей БД, вы бы предложили использовать Berkeley Hash или BTree для хранения этих значений, чтобы найти быстрее? - person VolatileRig; 27.09.2010
comment
Хэш хорош для быстрого уникального поиска и добавления. BTree держит все в порядке. Для уникального поиска используйте хэш. Для обработки нескольких столбцов данных вы можете использовать Storable или другой сериализатор, чтобы сгладить данные, чтобы они находились в столбце данных. MLDBM — один из инструментов, помогающих в этом. Вы также можете использовать DBD::DBM, чтобы получить интерфейс DBI SQL для ваших данных. - person daotoad; 28.09.2010

Существует много типов баз данных, но если вы уже выбрали базу данных SQL и пытаетесь упростить процесс установки, вы можете взглянуть на SQLite и модули DBI/DBD::SQLite, которые позволяют вам использовать это из перл.

person rafl    schedule 26.09.2010
comment
Да, я читал сайт SQLite, похоже, это то, что мне нужно. Если вы не возражаете, не могли бы вы дать мне несколько простых шагов для настройки среды на компьютере с Windows? Или, по крайней мере, некоторые современные документы о том, как это сделать. Я скачал sqlite_amalgamation-3_7_2.zip, но теперь я потерялся... - person VolatileRig; 26.09.2010
comment
Установите Strawberry Perl и скажите его CPAN-клиенту установить два модуля, которые я упомянул. - person rafl; 26.09.2010
comment
О, не знал, что все обрабатываются этими модулями. Спасибо, попробую. - person VolatileRig; 26.09.2010
comment
DBD::SQLite включен как в Strawberry, так и в ActivePerl. Клубника, конечно, лучше. - person Alexandr Ciornii; 26.09.2010

Загляните в DBI. Если вам не нравится SQL в ваших программах, попробуйте SQL::Abstract.

person Alan Haggai Alavi    schedule 26.09.2010