|
|
|
| Добрый день! Никак не мог определиться с разделом форума, всё же сюда поместил! Как всегда спасибо Вам за внимание и помощь!!!
У меня есть задача написать скрипт добавления большого количества текстовых записей в базу MySQL. Добавляю пока их только я, поэтому тут можно какой то не совсем красиво-удобно-наглядный метод использовать. Главное сделать это эффективно, быстро и с минимальной нагрузкой на сервер.
Записи чаще всего хранятся в Excel файле по строчке на каждую. Запись чаще не длиннее 30 символов. (что то вроде лог файла).
Поскольку объемы бывают достаточно большими, обработать обычной POST загрузкой например CSV файл достаточно накладно, так как сервер не принимает файлы большого объема, да и вообще ему не хватает времени на выполнение скрипта, чтобы все записи обработать проверить на валидантность... отбросить ненужные...
В итоге я реализовал следующую схему:
Все записи принимаются не путем загрузки файла, а из TextArea. Файл просто копипаститься в нее, после чего JavaScript обрабатывает все строчки по очереди на ту самую валидантность, отправляя на сервер по одной при помощи AJAX уже отформатированные записи. Пока не получит ответ от сервера, следующую запись не загружает. Отправка одной занимает в среднем 325мс. Так получается PHP сервер меньше времени тратит на обработку записи (просто проверяет есть или нет в базе и собс-но заносит ее или не заносит, остальные проверки проводит JS).
Но записей действительно много, хостинг провайдер обратил внимание на большое количество запросов на сервере. Скрипт иногда повисает, поэтому приходиться за ним следить и перезапускать несколько раз на дню. (причину так и не выяснил повисания).
Нужен адекватный метод! Как вы думаете какое тут самое оптимальное решение? Должно быть быстро, без зависаний и не ресурсоёмко!
Думаю может sleep(delay) какой нибудь поставить между запросами. Или все же не по одному отправлять, а как то группой небольшой хотя бы...
Не знаю что еще придумать!
Надеюсь, на этом форуме мне как всегда помогут в моих размышлениях! СПАСИБО!!!!! | |
|
|
|
|
|
|
|
для: Job
(05.09.2013 в 04:25)
| | >после чего JavaScript обрабатывает все строчки по очереди на ту самую валидантность, отправляя на сервер по одной при помощи AJAX уже отформатированные записи. Пока не получит ответ от сервера, следующую запись не загружает.
>провайдер обратил внимание на большое количество запросов на сервере. Скрипт иногда повисает
Хорошо, что вообще не матерится скрипт, а только иногда виснет. Вы своей идей грузите сервер, и растягиваете операцию на длительное время.
Поскольку объемы бывают достаточно большими, обработать обычной POST загрузкой например CSV файл достаточно накладно - большие это сколько? Такой огромный объем, что сервер не принимает, и почему CSV, если как вы пишите данные это одна строка по 30 символов?
Массив всегда модно разбить на части (на объем который примет mysql), и эту часть записать одним запросом (многосточная вставка).
Да, добавьте sleep - будет удобно, и выспаться можно будет. | |
|
|
|
|
|
|
|
для: confirm
(05.09.2013 в 10:28)
| | > большие это сколько? Такой огромный объем, что сервер не принимает, и почему CSV, если как вы пишите данные это одна строка по 30 символов?
Большой - это больше допустимого объема файла для загрузки на сервер. Настройки сервера менять нельзя. Максимальный размер файла: 2M. Максимальное время загрузки файла: 30 сек - это настройки сервера.
CSV так как строчек таких по 30 символов, может быть по 800 000 и гораздо больше. У одной строки может быть от одного до трех столбцов. В итоге все вместе где то 30 символов в среднем на строчку.
> Массив всегда модно разбить на части (на объем который примет mysql), и эту часть записать одним запросом (многосточная вставка).
А какой объем принимает MySQL максимально? Как это узнать? | |
|
|
|
|
|
|
|
для: Job
(05.09.2013 в 13:23)
| | может быть стоит подумать о смене хостинга? | |
|
|
|
|
|
|
|
для: psychomc
(05.09.2013 в 13:30)
| | Какие сервера кто использует? Я уже полгода пользуюсьуслугами компании http://sartelekom.ru/ , которая предлагает аренду серверов в России, Германии и остальной Европе. Никаких претензий нет. | |
|
|
|
|
|
|
|
для: Job
(05.09.2013 в 13:23)
| | CSV так как строчек таких по 30 символов - я понимаю это, я не понимаю почему вы ради облегчения работы сервера не делаете практически ничего полезного на клиенте. То есть вы выдираете строку из файла, и построчно заваливаете сервер запросами. Но ведь было бы гораздо полезнее сформировать массив данных из части файла, и отправить его на обработку серверу.
Собственно можно и на клиенте уже сформировать строку для много-строчной записи в базу (одним запросом). В этом случае запросов будет не тысячи, а гораздо меньше. Кроме этого, если эта задача как отдельный сервис, и не обязательно в рамках html-страницы, то можно сделать html-приложение (HTA, работает на Win платформе), что снимет многие ограничения и будет доступен широкий инструментарий для обработки/хранения этих файлов, гораздо эффективный, нежели форма, поле ввода ее и JS.
Максимальный объем данных которые можно таким образом вносить в базу можно узнать:
<?
$q = mysql_query("SHOW VARIABLES LIKE 'max_allowed_packet'");
$max = mysql_result($q,0,1); //в байтах
|
А по максимальной длине строки в файлах для записи легко вычислить количество пакетов для записи в базу. | |
|
|
|