За последние 24 часа нас посетили 14846 программистов и 1730 роботов. Сейчас ищут 655 программистов ...

Загрузка больших прайсов в базу данных

Тема в разделе "Решения, алгоритмы", создана пользователем RDS25, 7 янв 2018.

  1. RDS25

    RDS25 Новичок

    С нами с:
    7 янв 2018
    Сообщения:
    5
    Симпатии:
    0
    Приветствую всех.

    Я тут новенький, да и в программировании на PHP я факультативно, но нравится это дело.
    Подскажите, как правильно решать мою проблему? извините, если длинно.

    Сайт на хостинге PHP+MySQL. Ограничение по выполнению скрипта 2 минуты.
    Задача в базу загрузить прайс 600-900 тыс. строк (CSV 85-100 Мб). При этом надо не тупо брать строки из файла и заливать в базу, а обрабатывать их, пересчитывать цены и т.д., а потом заливать.

    Как делаю сейчас (для маленьких файлов до 60 тыс строк):
    1. Загружаю файл на сервер через форму на сайте.
    2. Читаю его по строкам, изменяю те параметры которые надо и заливаю в базу.
    3. На экран вывожу строку, что мол такая-то запись занесена успешно.
    Если файл больше 60 тыс. строк, то скрипт отваливается по таймауту.

    Как делаю сейчас (для больших файлов):
    1. На локальном компе запускаю Denwer
    2. Загружаю файл на локальных сайт через форму.
    3. Читаю его по строкам, изменяю те параметры которые надо и заливаю в базу. Поставил безумно большое время исполнения скрипта, поэтому файл за 10 мин успевает загрузиться.
    4. Вручную программой Navicat соединяю свой локальный MySQL и MySQL на хостинге (прямой вход есть с ограничением по IP). Перекачиваю базу с одного SQL на другой. Всё.

    Сами видите, что жуть как криво. Я не особо программер, делал для своих нужд, по ходу дела изучал PHP, MySQL и т.д.

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

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @RDS25, делай в консоли.
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Wrong way. Если это стандартная операция, то стоит завести таблицу с сырыми данными, а потом обработать с помощью хранимых процедур БД. Можно даже не обрабатывать а строить view.
     
  4. RDS25

    RDS25 Новичок

    С нами с:
    7 янв 2018
    Сообщения:
    5
    Симпатии:
    0
    Я вас правильно понял... Залить файл как есть во временную таблицу, потом с помощью хранимых процедур преобразовать данные в нужные и результат залить в постоянную таблицу?
    Придется разобраться, что это за зверь "хранимые процедуры" и сильно ли они грузят хостинг, т.к. записей то под 1 млн. в некоторых таблицах.

    Может есть какой-то способ пакетной загрузки файла, чтоб не каждую строчку из файла брать и делать INSERT ?
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    да
    Код (Text):
    1. INSERT INTO `table` (`field_1`, `filed_2`...) VALUES ('val_1', 'val_2', ...), ('val_1', 'val_2', ...), ('val_1', 'val_2', ...), ('val_1', 'val_2', ...), ('val_1', 'val_2', ...)...
    узнать максимальную длину запроса в байтах можно с помощью запроса
    Код (Text):
    1. SHOW VARIABLES LIKE 'max_allowed_packet';
    обычно это мегабайт, то есть можно тысячи строк склеить в один запрос.
     
  6. RDS25

    RDS25 Новичок

    С нами с:
    7 янв 2018
    Сообщения:
    5
    Симпатии:
    0
    Большое спасибо за помощь. Буду изучать в этом направлении.
     
  7. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Несколько вариантов решения задачи.
    Если файлы у вас загружены на сервер
    Напишите скрипт который разделит эти файлы на мелкие и далее с помощью фронтенда, ajax(посылаем и контролируем команды) отрабатываем наши файлы.
    Так-же рассмотрите использование загрузки в базу с помощью LOAD DATA