2009-09-09 1 views
2

Я соскабливаю веб-сайт (отвечаю за скриптизацию, регулируя мои выскабливания и с разрешения), и я собираюсь собирать статистику о 300 000 пользователей.Когда вы очищаете много статистики с веб-страницы, как часто я должен вставлять собранные результаты в свою БД?

Я планирую хранить эти данные в базе данных SQL, и я планирую соскабливать эти данные один раз в неделю. Мой вопрос заключается в том, как часто я должен делать вставки в базе данных, поскольку результаты поступают из скребка?

Лучше всего подождать до тех пор, пока все результаты не будут (сохраняя их все в памяти), и вставьте их все, когда скребок будет закончен? Или лучше делать вставку на каждый результат, который приходит (приходя с приличной скоростью)? Или что-то среднее?

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

Кроме того, будет ли изменен ответ, если я сохраню эти результаты в плоском файле или базе данных?

Благодарим вас за внимание!

+0

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

+0

Я собираю статистику, посещая страницы профиля нишевого игрового сайта. Я получил разрешение, поскольку я планирую создать ранжирование лестницы на основе определенных аспектов данных пользователей каждую неделю. – Mithrax

ответ

3

Возможно, вы получите увеличение производительности, выполнив несколько сотен, если ваша база данных поддерживает вставку нескольких строк для каждого запроса (как MySQL, так и PostgreSQL). Вероятно, вы также получите больше производительности, добавив несколько вложений для каждой транзакции (за исключением баз данных без транзакций, таких как MySQL с MyISAM).

Преимущества дозирования будут быстро падать по мере увеличения размера партии; вы уже уменьшили накладные расходы на запрос/фиксацию на 99% к тому времени, когда вы делаете 100 за раз. По мере увеличения вы столкнетесь с различными ограничениями (пример: самый длинный разрешенный запрос).

Вы также столкнетесь с другим большим компромиссом: если ваша программа умрет, вы потеряете любую работу, которую вы еще не сохранили в базе данных. Потеря 100 не так уж плоха; вы, вероятно, можете переделать эту работу через минуту или две. Потеря 300 000 займет довольно много времени для повтора.

Резюме: Лично я бы начал с одного значения/одного запроса, так как это будет проще всего реализовать. Если бы я нашел, что время вставки было узким местом (очень сомневаюсь, царапины будут намного медленнее), я бы переместился на 100 значений/запросов.

PS: Поскольку администратор сайта дал вам разрешение, спросили, можете ли вы просто получить дамп базы данных соответствующих данных? Сэкономит много работы!

+0

+1 или, по крайней мере, дамп данных XML в качестве веб-службы ... –

1

Мое предпочтение заключается в том, чтобы записывать массивные данные в базу данных каждые 1000 строк, когда я должен делать это так, как вы описываете. Это похоже на хороший объем. Не слишком много переработано, если у меня случился сбой, и вам нужно сгенерировать некоторые данные (повторное выскабливание в вашем случае). Но это хороший здоровый укус, который может уменьшить накладные расходы.

Как @derobert points out, обертывание кучи вставок в транзакции также помогает уменьшить накладные расходы. Но не ставьте все в одну транзакцию - некоторые производители РСУБД, такие как Oracle, сохраняют «повторный журнал» во время транзакции, поэтому, если вы делаете слишком много работы, это может вызвать перегрузку. Разбивая работу на большие, но не слишком большие, куски лучше. То есть 1000 рядов.

Некоторые реализации SQL поддерживают многострочный INSERT (это также упоминает @derobert), а некоторые нет.

Вы правы, что очистка необработанных данных до плоского файла и последующая загрузка его позже, вероятно, стоит того.Каждый поставщик SQL поддерживает этот тип массовой загрузки по-разному, например LOAD DATA INFILE в MySQL или «.import» в SQLite и т. Д. Вам нужно будет рассказать нам, какую марку базы данных SQL вы используете для получения более конкретных инструкций, но в мой опыт такого механизма может составлять 10-20x производительность INSERT даже после таких улучшений, как использование транзакций и многострочная вставка.


Re свой комментарий, вы можете захотеть взглянуть на BULK INSERT в Microsoft SQL Server. Обычно я не использую Microsoft, поэтому у меня нет первоклассного опыта, но я полагаю, что это полезный инструмент в вашем сценарии.

+0

Я использую MSSQL, поэтому я не уверен, как это повлияет на вещи. – Mithrax

 Смежные вопросы

  • Нет связанных вопросов^_^