Как мога да манипулирам локална база данни с 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, които ви позволяват да използвате това от perl.

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