Рубрики
Без рубрики

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

Автор оригинала: FreeCodeCapm Team.

Vlad Wetzel.

Нахождение вашей следующей книги программирования трудно, и это рискованно.

Как разработчик, ваше время мало, и чтение книги занимает много того времени. Вы можете быть программированием. Вы могли бы отдохнуть. Но вместо этого вы выделяете драгоценное время для чтения и расширения ваших навыков.

Так какую книгу вы должны читать? Мои коллеги, и я часто обсуждаю книги, и я заметил, что наши мнения на данной книге дико варьируются.

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

К счастью, обмен стеками (материнская компания переполнения стека) только что опубликовала свой дамп данных. Поэтому я сел и получил кодирование.

Вскоре после этого я запустил dev-books.com , что позволяет вам исследовать все данные, которые я собрал и отсортировал. У меня было более 100 000 посетителей и получили много отзывов, просив меня описать весь технический процесс.

Итак, как и пообещал, я собираюсь описать, как я построил все прямо сейчас.

Получение и импорт данных

Я схватил дамп базы данных обмена стеками из Archive.org Отказ

С самого начала я понял, что невозможно было бы импортировать файл XML XML 48 ГБ в свеже созданную базу данных (PostgreSQL), используя популярные методы, такие как myxml ('path/to/my_file.xml') потому что у меня не было 48 ГБ оперативной памяти на моем сервере. Итак, я решил использовать Сакс парсер.

Все значения были сохранены между . Оу> Теги, поэтому я использовал сценарий Python для того, чтобы разбирать его:

После трех дней импорта (почти половина 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.