Почему сохранение данных из API в CSV происходит быстрее, чем загрузка их в базу данных MongoDB?
Мой вопрос вращается вокруг понимания следующих двух процедур (в частности, производительности и логики кода), которые я использовал для сбора торговых данных из 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 и операций с базой данных? Отличаются ли ваши методы в производственных средах от личных случаев использования (в моем случае мне просто нужны были данные, и несколько часов ожидания были в порядке)?
- Вы бы использовали другой язык программирования или другой пакет / модуль для этой процедуры сбора данных?