mysql — PHP сопоставляет JSON / CSV с базой данных SQL с множеством настроек (cakePHP)

Я хочу вставить файл JSON (также доступен в формате CSV) в базу данных mySQL, используя инфраструктуру cakePHP. Основы понятны, но окружающие требования усложняют:

  1. Файл JSON / CSV имеет большой размер (около 200 МБ и до 200 000 строк).
  2. Файл содержит несколько полей. Эти поля должны быть сопоставлены с полями с разными именами в базе данных mySQL.
  3. CSV содержит поле с именем art_number. Это поле также присутствует в базе данных mySQL. art_number является уникальным, но не первичным ключом в MySQL. Я хочу обновить запись MySQL, если CSV и база данных имеют одинаковые art_number. Если нет, новая запись должна быть создана.
  4. Несколько полей CSV-файла должны быть обработаны перед сохранением. Также необходимо добавить дополнительные поля.
  5. CSV содержит URL изображения. Если это НОВАЯ запись (неизвестный номер_ арты) для базы данных, это изображение следует скопировать, изменить (с помощью imagick) и сохранить на сервере.
  6. Вся работа должна выполняться ежедневно.

Как вы можете видеть, многое происходит с некоторыми ограничениями (память, время выполнения и т. Д.). Но я не уверен, как подойти к этому с точки зрения архитектуры. Например. я должен сначала попытаться вставить все в отдельную таблицу базы данных «import», а затем выполнить шаги по отдельности? Как можно получить идентификаторы из базы данных, сопоставленной с линиями CSV? Cakephp может выполнять создание новой или обновление существующей записи, если я могу сопоставить идентификатор на основе номера art_number. Также изменение и копирование до 200 000 изображений, кажется большой проблемой. Так как же разбить это на более мелкие куски?

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

0

Решение

Буду признателен, если вы поможете найти правильную стратегию здесь. Что мне нужно учитывать с точки зрения памяти и скорости?

  • Использовать оболочку для импорта
  • Читайте данные кусками из X строк или X количество данных, чтобы избежать проблем с памятью, а затем обработать эти куски. Это простая петля.
  • Если обработка потребует ДОЛГОГО времени, подумайте об использовании очереди заданий, например Resque. Вы можете обновить статус прогресса пользователю при необходимости.

Есть ли смысл разбивать процесс на разные работы? Что / как бы ты это сделал?

Это зависит от требований и от того, сколько времени займет обработка, а также от того, сколько ваша система может обрабатывать параллельно, не загружая процессор до 100% и эффективно замедляя работу сайта. В этом случае переместите обработку на другой компьютер или ограничьте использование ЦП для этого процесса, используя хорошая команда.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]