Perl и огромные базы данных, как искать и хранить? - PullRequest
1 голос
/ 10 сентября 2010

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

Мне, вероятно, предоставят базу данных в формате csv, в которой будет минимум 36 миллионов строк данных. В будущем пользователи должны будут искать эту «базу данных» через интерфейс CGI / perl, основываясь на некоторых условиях, зависящих от значений нескольких столбцов, и отображать совпадающие строки.

Как мне с помощью perl прочитать формат csv (возможно, с использованием CSV-парсера из CPAN) и сохранить в какой тип базы данных? Ключевым приоритетом будет скорость поиска в базе данных.

Любое примерное кодирование приветствуется

Ответы [ 6 ]

6 голосов
/ 10 сентября 2010

Возможно, вы захотите выбрать подходящее решение для базы данных.Самым простым в настройке (в зависимости от вашего знакомства с RDBMS), вероятно, является MySQL .Как только вы это настроите, вы захотите изучить модули Perl для взаимодействия с базой данных.DBIx::Class - это «в деле» в наши дни, и поэтому многие используют его, чтобы ответить на вопросы.

О, и для анализа вашего CSV посмотрите на Text::CSV, если вы не хотите загружать его непосредственно в базу данных (и если выбранная вами СУБД не поддерживает прямой прием файлов CSV).

3 голосов
/ 10 сентября 2010

PostgreSQL имеет возможность импортировать файлы CSV:
http://www.postgresql.org/docs/current/static/sql-copy.html
Команда COPY также более эффективна, чем фиксация 36M вставок, по одной за раз.

Вы должны изучить способы импорта данных после проектирования в СУБД. С таким количеством записей, я бы не упомянул о MySQL.

Если данные не являются реляционными и будут только увеличиваться, вы можете захотеть использовать Hadoop или какую-либо другую форму MapReduce. Эти 30-минутные запросы превратятся в 5 минут.

2 голосов
/ 10 сентября 2010

В большинстве баз данных есть средства для прямой загрузки файла CSV в таблицу.Например, SQLLoader для Oracle или команда load для MySQL.

Эффективный поиск в базе данных будет зависеть от данных и ожидаемых результатов поиска.(т.е. какие поля будут интересны, какие из них вы можете сортировать и т. д.) Без дополнительной информации трудно дать твердый ответ, хотя вы должны следовать общим рекомендациям по индексированию.

В отношении кодапримеры доступа к базе данных см. по следующим ссылкам:

Пример MySQL DBI

PERL DBI Doc

1 голос
/ 10 сентября 2010

Сначала используйте T ext :: CSV_XS для анализа файла CSV.

Во-вторых, какую базу данных использовать и как ее структурировать, зависит от того, какие поиски будут выполняться.

Если вы выполняете простое сопоставление ключевых слов, хранилище значений ключей будет очень быстрым. Что-то вроде Беркли БД будет хорошо.

Если у вас есть более сложные потребности, вы можете рассмотреть базу данных SQL, такую ​​как MySQL, PostgreSQL, Oracle, SyBase и т. Д. Настройка и проектирование базы данных SQL - это отдельная область исследований. Однако я дам несколько советов и рекомендую вам очень тщательно подумать о том, какие индексы можно применять к вашим полям, чтобы максимизировать скорость запроса.

0 голосов
/ 16 мая 2014

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

анонимус

0 голосов
/ 10 сентября 2010

Иногда Perl удивляет своей эффективностью в работе с основными сценариями. Тем не менее, если все ваши варианты использования доступны только для чтения, а информация статична / неизменна, я бы посмотрел, как грубый метод простого открытия файла и его поиска сработал первым.

Предполагая, что это неприемлемо, тогда вам просто нужно взглянуть на DBI, способ общения Perl с базой данных и запустить миллионы вставок один раз, и тогда ваши чтения будут быстрыми с современной СУБД, такой как MySQL или SQL Server. .

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