2013-11-08 5 views
0

Я работаю над проектом, который требует, чтобы я взял живой твиттер и сохранил записи из него в базе данных PostgreSQL. Проект требует сохранения данных местоположения твитов для поиска в PostGIS. Я использую скрипт perl для получения фида Twitter (используя AnyEvent :: Twitter :: Stream и API Twitter). Каждые 5000 твитов, скрипт fork() s и дочерний процесс вызывают SQL для вставки строк. Я использую AutoCommit => 0 для ускорения вставок.Вставить в базу данных PostgreSQL/PostGIS слишком медленно

Проблема заключается в том, что дочерний процесс не выполняется, сохраняя 5000 твитов до появления следующих 5000, поэтому я получаю многочисленные процессы postgres. Мне нужно выяснить, как ускорить вставки базы данных, чтобы позволить дочернему процессу выйти до следующего запуска.

задачи, которые дочерний процесс делает сейчас (для каждого твита) являются:

  • Вставьте запись в таблице чириканье, используя ST_GeomFromEWKT для преобразования данных широты/долготы для ГИС координаты
  • Застраховать что автор твита и любых пользователей, указанных в твиттере в таблице пользователей
  • Вставить упоминает пользователей и хэштегов в соответствующих таблицах

Любые консультации по ди ускорение процесса или ускорение процесса было бы наиболее полезным. В конечном итоге это должно работать в реальном времени, поэтому временные таблицы и текстовые файлы не являются хорошими вариантами. Сервер - это сервер с двумя Xeon HP, на котором работает Debian с 8G оперативной памяти.

+0

[Bulk нагрузки] [1], а также рассмотреть вопрос об увеличении его до более чем 5000? [1]: http://stackoverflow.com/questions/758945/whats-the-fastest-way-to-do-a-bulk-insert-into-postgres – runrig

+0

Как вы можете спросить о производительности а затем не дают никаких цифр? Вы получаете 5000 твитов в час, минуту, секунду? На каких дисках вы используете 16 x SSD в RAID10, USB-накопитель? –

ответ

4

В postgres docs - комментарий об ускорении вставок путем неправильного использования вставки из предложения select. Это, кажется, существенная разница, вы пробовали это?

Полезный совет для более быстрого Вставки: Вы можете использовать INSERT INTO TBL < запроса > синтаксиса для ускорения скорости вставок путем дозирования их вместе. Например ...

INSERT INTO my_table SELECT 1, 'a' UNION SELECT 2, 'b' UNION SELECT 3, 'c' UNION ... 

Если партии на много наборов значений в заявлении INSERT и партию до нескольких операторов INSERT за транзакцию, вы можете достичь значительно более высокой производительности вставки. Мне удалось получить почти 8-кратные более быстрые вставки на установке PostgreSQL 8.1/Win2K, выполнив до 100 (малый) с использованием этой техники.

В противном случае, если вы не можете получить postgres до требуемой скорости, вы можете проверить свою производительность ввода-вывода на коробке HP.

Кроме того, проверьте, есть ли обновленные индексы после вставки. Возможно, вам даже нужно попрощаться со многими вашими ограничениями (ограничения FK). Это позволит вставить записи в любом порядке, и нет необходимости ждать, пока пользователь будет создан, прежде чем вставлять твит.

Я также хотел бы проверить, есть ли возможность проверить пользователей в db, пока вы собираете твиты. И последнее, но не менее важное: вы должны реализовать очередь, чтобы вставлять партии из 5000 твитов, а не просто запускать их в db.

+0

Отличный отклик и бонус за предложение собрать твиты в очередь. – ChuckCottrill

+0

Удаление отдельной проверки для имени пользователя устранило проблему, поэтому поиск был слишком медленным. Как процедура очереди лучше, чем просто использование одной транзакции? –

+0

Если ваша база данных становится слишком медленной для обработки ваших запросов, ваше приложение будет перегружать базу данных. При подходе к очереди вы можете даже остановить базу данных во время обработки большого объема, запустить ее снова, и в конечном итоге она будет догонять до «реального времени». Очередь не заменяет транзакцию. Он запускает ваши данные для обработки до начала транзакции. Он немедленно удаляется из очереди, если db неактивен. – thst

0

I've benchmarked performance of creating points и ST_GeomFromEWKT - самый медленный метод.Попробуйте использовать ST_MakePoint в подготовленном заявлении для минимизации накладных расходов:

use DBI; 

# Prepare an insert 
$sth=$dbh->prepare("INSERT INTO mytable (geom) ". 
        "SELECT ST_SetSRID(ST_MakePoint(?, ?), 4326) AS geom"); 

# In a for-loop of 5000 points, do the insert 
$sth->execute($longitude, $latitude); 
Смежные вопросы