Мой вопрос связан с пониманием следующих двух процедур (в частности, производительности и логики кода), которые я использовал для сбора торговых данных из API Бюро переписей США. Я уже собрал данные, но в итоге я написал два разных способа запроса и сохранения данных, к которым относятся мои вопросы.
Сводка моих последних вопросов приведена внизу.
Первый способ: запрос npm и mongodb для сохранения данных
Я ограничил свою процедуру с помощью tiny-async-pool (задает параллелизм выполнения определенной функции), чтобы не пытаться запрашивать слишком много за один раз или получать тайм-аут или перегружать мою базу данных запросами. Проще говоря, узким местом, с которым я столкнулся, была база данных, поскольку запросы API возвращались довольно быстро (в зависимости от размера тела 1-15 секунд), но для сохранения каждого элемента массива (возвращаемые данные представляли собой вложенный массив, иногда от нескольких сотен элементов до более сто тысяч элементов (не более 10 значений в каждом массиве) в своем собственном документе mongodb варьировались от 100 мс до 700 мс. Чтобы сэкономить время от возможных ошибок и не повторять одни и те же запросы, я также проверил в своей базе данных перед выполнением запроса, чтобы убедиться, что запрос уже завершен. Конечный результат состоял в том, что я не следовал этому методу, так как он был очень подвержен ошибкам и чувствителен к тайм-аутам, если данные были очень большими (я даже установил таймаут на 10 минут в опциях запроса).
Второй способ: запрос npm и сохранение данных в csv
Я использовал тот же подход, что и первый метод для запросов и параллелизма, однако я сохранил каждый запрос в свой собственный CSV-файл. В случае ошибок и не повторения успешных запросов я также проверил, существует ли файл, и пропустил ли этот запрос. Этот подход был безошибочным, я запустил его и через несколько часов смог сохранить все данные. Писать в csv было безумно быстро, гораздо больше, чем при использовании mongodb.
Итоговое резюме и вопросы
Моя конечная цель состояла в том, чтобы получить данные как можно проще. Я использовал javascript, потому что именно там я узнал api-запросы и асинхронные операции, хотя большую часть своего анализа данных я буду выполнять с помощью python и pandas. Сначала я попробовал метод базы данных в основном потому, что думал, что это правильный путь, и я хотел улучшить свои навыки работы с базой данных CRUD. После бесчисленных часов рефакторинга кода и пробуя новые методы, я все еще не мог заставить его работать должным образом. Я прибег к методу csv: а) гораздо меньше кода для написания, б) меньше проверок, в) быстрее и г) более надежно.
Мои последние вопросы:
- Почему подход csv лучше, чем подход с базой данных? Какие-нибудь контраргументы или другие подходы, которые вы бы использовали?
- Как вы справляетесь с узкими местами и параллелизмом в своих приложениях в отношении API и операций с базой данных? Отличаются ли ваши методы в производственных средах от личных случаев использования (в моем случае мне просто нужны были данные, и несколько часов ожидания были хорошими)?
- Вы бы использовали другой язык программирования или другой пакет / модуль для этой процедуры сбора данных?