Автор оригинала: FreeCodeCapm Team.
Vlad Wetzel.
Нахождение вашей следующей книги программирования трудно, и это рискованно.
Как разработчик, ваше время мало, и чтение книги занимает много того времени. Вы можете быть программированием. Вы могли бы отдохнуть. Но вместо этого вы выделяете драгоценное время для чтения и расширения ваших навыков.
Так какую книгу вы должны читать? Мои коллеги, и я часто обсуждаю книги, и я заметил, что наши мнения на данной книге дико варьируются.
Поэтому я решил глубже взглянуть в проблему. Моя идея: разбирать самые популярные программисты в мире в мире для ссылок на известную книжный магазин, а затем подсчитать, сколько упоминается каждая книга.
К счастью, обмен стеками (материнская компания переполнения стека) только что опубликовала свой дамп данных. Поэтому я сел и получил кодирование.
Вскоре после этого я запустил dev-books.com , что позволяет вам исследовать все данные, которые я собрал и отсортировал. У меня было более 100 000 посетителей и получили много отзывов, просив меня описать весь технический процесс.
Итак, как и пообещал, я собираюсь описать, как я построил все прямо сейчас.
Получение и импорт данных
Я схватил дамп базы данных обмена стеками из Archive.org Отказ
С самого начала я понял, что невозможно было бы импортировать файл XML XML 48 ГБ в свеже созданную базу данных (PostgreSQL), используя популярные методы, такие как myxml ('path/to/my_file.xml')
потому что у меня не было 48 ГБ оперативной памяти на моем сервере. Итак, я решил использовать Сакс парсер.
Все значения были сохранены между
После трех дней импорта (почти половина XML была импортирована в это время), я понял, что допустимую ошибку: ParentId
атрибут должен был быть ParentId
Отказ
На данный момент я не хотел ждать еще недели и переехал из AMD E-350 (2 × 1,35 ГГц) до Intel G2020 (2 x 2,90 ГГц). Но это все еще не ускорило процесс.
Следующее решение – Пакетная вставка:
Stringio позволяет использовать переменную, такой как файл для обработки функции copy_from
, который использует Скопировать
Отказ Таким образом, весь процесс импорта занял только одну ночь.
Хорошо, время создавать индексы. Теоретически, индексы сущности медленнее, чем джин, но занять меньше места. Поэтому я решил использовать гид. Через еще один день у меня был индекс, который занял 70 ГБ.
Когда я попробовал пару тестовых запросов, я понял, что их слишком много времени для обработки. Причина? Диск IO ждет. SSD GoodRam C40 120GB много помогли, даже если это не самый быстрый SSD.
Я создал совершенно новый кластер PostgreSQL:
initdb -D /media/ssd/postgresq/data
Затем я позаботился, чтобы изменить путь в моем сервисном конфиге (я использовал OS Manjaro):
vim /usr/lib/systemd/system/postgresql.service
Environment=PGROOT=/media/ssd/postgresPIDFile=/media/ssd/postgres/data/postmaster.pid
Я перезагрузил свой конфигурацию и запустил PostgreSQL:
systemctl daemon-reloadpostgresql systemctl start postgresql
На этот раз это заняло пару часов для импорта, но я использовал Джин. Индексирование заняло 20 ГБ пространства на SSD, а простые запросы занимали меньше минуты.
Извлечение книг из базы данных
С помощью моих данных наконец-то импортировано, я начал искать сообщения, которые упомянули книги, а затем скопировали их на отдельную таблицу, используя SQL:
CREATE TABLE books_posts AS SELECT * FROM posts WHERE body LIKE '%book%'";
Следующим шагом было находить все гиперссылки внутри этих:
CREATE TABLE http_books AS SELECT * posts WHERE body LIKE '%http%'";
На данный момент я понял, что Stackoverflow Proxies все ссылки, такие как: radsstackowerflow.com/[$isbn]/
Я создал еще один стол со всеми сообщениями со ссылками:
CREATE TABLE rads_posts AS SELECT * FROM posts WHERE body LIKE '%http://rads.stackowerflow.com%'";
Использование регулярных выражений для извлечения всех ISBNS Отказ Я извлек теги переполнения стека на другой стол через regexp_split_to_table
Отказ
После того, как у меня были самые популярные теги, извлеченные и подсчитанные, топ из 20 наиболее упомянутых книг по тегам был очень похожим на все теги.
Мой следующий шаг: переработка тегов.
Идея состояла в том, чтобы взять топ-20 упомянутых книг из каждого тега и исключать книги, которые уже были обработаны.
Поскольку это было «одноразовая» работа, я решил использовать PostgreSQL массивы. Я написал скрипт, чтобы создать запрос, как так:
С данными в руках я направился к сети.
Создание веб-приложения
Поскольку я не веб-разработчик – и, безусловно, не эксперт по интерфейсу веб-пользователей – я решил создать очень простое одностраничное приложение на основе темы загрузки по умолчанию.
Я создал опцию «Поиск по меткам», затем извлекил самые популярные теги, чтобы сделать каждый кликабельный поиск.
Я визуализировал результаты поиска с гистограммой. Я попробовал лысы и D3, но они были больше за панелью. У них были некоторые проблемы с отзывчивостью, и были довольно сложными для настройки. Итак, я создал свой собственный отзывчивый график на основе SVG. Чтобы сделать это отзывчивым, он должен быть перерисован на событии изменения ориентации экрана:
Сбой веб-сервера
Сразу после того, как я опубликовал dev-books.com У меня была огромная толпа, проверая мой веб-сайт. Apache не мог служить более 500 посетителей одновременно, поэтому я быстро настроил Nginx и переключился на него на пути. Я был очень удивлен, когда посетители в реальном времени выстрелили до 800 одновременно.
Заключение:
Я надеюсь, что я объяснил все достаточно, чтобы вы поняли, как я построил это. Если у вас есть вопросы, не стесняйтесь спросить. Вы можете найти меня в твиттере и Facebook Отказ
Как и обещал, я опубликую свой полный отчет от Amazon.com и Google Analytics в конце марта. Результаты до сих пор были действительно удивительными.
Убедитесь, что вы нажимаете на зеленое сердце ниже и следуйте за мной для получения дополнительных историй о технологиях:)
Оставайся настроен на dev-books.com.