Советы по производительности при импорте больших наборов данных

У меня есть функция, которая позволяет пользователям импортировать контакты (адрес электронной почты и имя). Некоторые пользователи импортируют файлы с около 70000 контактов. Может быть или XLS или CSV. Это то, что у меня сейчас.

  1. Пользователь выбирает файл (со своего компьютера), из которого он хочет импортировать контакты.
  2. Я сохраняю файл на сервере и создаю запись в базе данных со ссылкой на местоположение файла.
  3. Amazon SQS используется для обработки этого в фоновом режиме.
  4. При первом запуске задания я обрабатываю файл, сохраняя только строки с адресом электронной почты и именем (если оно найдено). Данные сохраняются в файл JSON в том же месте и кэшируются. Затем я отпускаю задание обратно в очередь.
  5. Теперь контакты готовы к импорту. Я беру 1000 контактов в каждой работе и сохраняю каждый контакт в отдельной строке в базе данных. Я использую array_slice, чтобы пропустить контакты в файле JSON. Количество пропусков сохраняется в базе данных.
  6. Когда не осталось контактов, работа удаляется и все готово.

Это в значительной степени весь процесс. У меня также есть проверка (поиск в базе данных), чтобы проверить наличие дубликатов. Разрешены только уникальные адреса электронной почты.

У меня проблема в том, что работа, кажется, занимает слишком много времени, и я получаю тайм-ауты. Это приводит к тому, что импорт занимает много времени.

Итак, мой вопрос: есть ли что-нибудь, что я могу сделать лучше?

Позвольте мне знать, если вам нужно что-нибудь еще. У меня нет большого опыта работы с большими данными и многими пользователями.

РЕДАКТИРОВАТЬ: Мне не нужен код На что я похож, проблема в проблеме с сервером? Может быть, перемещение базы данных на свой собственный сервер поможет? Или я должен просто использовать другой подход?

РЕДАКТИРОВАТЬ 2: Пользователь может видеть ход импорта. Поэтому мне нужно рассчитать количество контактов и для этого мне нужно сначала отфильтровать строки без адреса электронной почты. И я тоже урезаю это и название колонки. Когда я сделал это, мне было проще сохранить новый набор данных в файл JSON.

РЕДАКТИРОВАТЬ 3: Тайм-ауты происходят при сохранении пользователей в базе данных, а не при первоначальной обработке и создании файла json.

РЕДАКТИРОВАТЬ 4Одним из способов ускорить его работу может быть сохранение его в виде фрагментов с самого начала (при первой обработке). Таким образом, мне не нужно обрабатывать счетчик пропусков, и мне не нужно использовать array_slice для большого набора данных. Кроме того, теперь, когда я думаю об этом, глупо сохранять его в файл json, а затем кэшировать. Почему бы не кэшировать массив с самого начала?

3

Решение

Я беру 1000 контактов в каждой работе и сохраняю каждый контакт в отдельном ряду.
в базе данных.

Я тоже сталкивался с проблемой раньше, но в моей проблеме мне нужно импортировать около 50000 записей присутствия сотрудников, я понял это с помощью распараллеливания. Вы тоже можете это заметить, поэтому вы берете 1000 контактов в каждой очереди. Настоящая проблема в том, что «Время ожидания процесса» мы правы, если мы так много возьмем?

Итак, мое решение против этого заключается в создать больше дочерних процессов чтобы сделать работу. Если я создам одно задание для выполнения 1000 операций импорта, оно будет занимать больше времени и медленнее. Так, Я создаю 100 рабочих мест в очередие с екаждая работа импортирует 100 записей. И я запускаю это вместе. В этом методе нагрузка на ваш процессор будет увеличиваться из-за этого. Это не проблема, если у вас высокопроизводительный компьютер.

Мое предложение:

  1. Создайте еще очередь заданий для импорта.
  2. Избегайте использования слишком большого количества циклов.
  3. Если возможно, храните ваши данные в memcached, потому что это ускорит ваш процесс. Я думаю, вы тоже так думаете. Прочитать о APC

Вы можете прочитать это Вот как хранить ваши данные в памяти. Надеюсь, это поможет вам немного 🙂

2

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

Ваша php-программа ожидает выполнения этой задачи? Это не сработает. Время истечет. Вы заметили это.

Вам необходимо организовать свою работу таким образом, чтобы ваша php-программа запускала задание в AWS SQS, а затем сообщала вашему пользователю, что задание запущено и будет выполнено через некоторое время. Установите низкие ожидания пользователей («сделано за 15 минут»), а затем превысьте их (5 минут), а не наоборот.

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

0