Выборка и сохранение в базе данных - время против памяти - PullRequest
0 голосов
/ 30 июня 2018

Предположим, у меня длинный список URL-адресов. Теперь мне нужно написать скрипт для следующего:

  • Перейти к каждому из URL
  • Получить возвращенные данные
  • и сохранить его в базе данных

Я знаю два способа сделать это -

  1. Вытащите один URL из списка, загрузите данные и сохраните их в базе данных. Получите следующий URL, загрузите данные, сохраните их в БД и повторите ...

Для этого потребуется слишком много операций записи на диск, так что другой способ -

  1. Загрузите данные с каждого из URL-адресов и сохраните их в памяти. И, наконец, сохраните все это в базу данных за одну запись на диск.

Но для этого потребуется перенести огромный объем данных в память. Таким образом, существует вероятность того, что программа может просто завершиться из-за ошибки OOM.

Есть ли какой-нибудь другой способ, который является своего рода промежуточным звеном между этими методами?

(В частности, я пишу этот скрипт на Джулия и использую MongoDB )

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Мы можем немного расширить решение @ Trifon за счет параллелизма. Вы можете одновременно запустить два потока:

  1. Поток, который извлекает данные из URL-адресов и сохраняет их в канале в памяти.
  2. Поток, который читает с канала и записывает данные на диск.

Убедитесь, что канал имеет ограниченную пропускную способность, чтобы поток 1 блокировался в случае слишком большого числа последовательных записей канала без использования потока потоком 2.

Предполагается, что у Юлии хорошая поддержка параллельных вычислений

0 голосов
/ 30 июня 2018

Запись результатов в базу данных в пакетном режиме, скажем, каждые 1000 URL.

Это решение представляет собой нечто среднее между 1 и 2 из двух способов, которые вы описали выше.

...