У меня есть функция, которая позволяет пользователям импортировать контакты (адрес электронной почты и имя). Некоторые пользователи импортируют файлы с около 70000 контактов. Может быть или XLS или CSV. Это то, что у меня сейчас.
Это в значительной степени весь процесс. У меня также есть проверка (поиск в базе данных), чтобы проверить наличие дубликатов. Разрешены только уникальные адреса электронной почты.
У меня проблема в том, что работа, кажется, занимает слишком много времени, и я получаю тайм-ауты. Это приводит к тому, что импорт занимает много времени.
Итак, мой вопрос: есть ли что-нибудь, что я могу сделать лучше?
Позвольте мне знать, если вам нужно что-нибудь еще. У меня нет большого опыта работы с большими данными и многими пользователями.
РЕДАКТИРОВАТЬ: Мне не нужен код На что я похож, проблема в проблеме с сервером? Может быть, перемещение базы данных на свой собственный сервер поможет? Или я должен просто использовать другой подход?
РЕДАКТИРОВАТЬ 2: Пользователь может видеть ход импорта. Поэтому мне нужно рассчитать количество контактов и для этого мне нужно сначала отфильтровать строки без адреса электронной почты. И я тоже урезаю это и название колонки. Когда я сделал это, мне было проще сохранить новый набор данных в файл JSON.
РЕДАКТИРОВАТЬ 3: Тайм-ауты происходят при сохранении пользователей в базе данных, а не при первоначальной обработке и создании файла json.
РЕДАКТИРОВАТЬ 4Одним из способов ускорить его работу может быть сохранение его в виде фрагментов с самого начала (при первой обработке). Таким образом, мне не нужно обрабатывать счетчик пропусков, и мне не нужно использовать array_slice для большого набора данных. Кроме того, теперь, когда я думаю об этом, глупо сохранять его в файл json, а затем кэшировать. Почему бы не кэшировать массив с самого начала?
Я беру 1000 контактов в каждой работе и сохраняю каждый контакт в отдельном ряду.
в базе данных.
Я тоже сталкивался с проблемой раньше, но в моей проблеме мне нужно импортировать около 50000 записей присутствия сотрудников, я понял это с помощью распараллеливания. Вы тоже можете это заметить, поэтому вы берете 1000 контактов в каждой очереди. Настоящая проблема в том, что «Время ожидания процесса» мы правы, если мы так много возьмем?
Итак, мое решение против этого заключается в создать больше дочерних процессов чтобы сделать работу. Если я создам одно задание для выполнения 1000 операций импорта, оно будет занимать больше времени и медленнее. Так, Я создаю 100 рабочих мест в очередие с екаждая работа импортирует 100 записей. И я запускаю это вместе. В этом методе нагрузка на ваш процессор будет увеличиваться из-за этого. Это не проблема, если у вас высокопроизводительный компьютер.
Мое предложение:
Вы можете прочитать это Вот как хранить ваши данные в памяти. Надеюсь, это поможет вам немного 🙂
Ваша php-программа ожидает выполнения этой задачи? Это не сработает. Время истечет. Вы заметили это.
Вам необходимо организовать свою работу таким образом, чтобы ваша php-программа запускала задание в AWS SQS, а затем сообщала вашему пользователю, что задание запущено и будет выполнено через некоторое время. Установите низкие ожидания пользователей («сделано за 15 минут»), а затем превысьте их (5 минут), а не наоборот.
Затем вам потребуется отдельная операция для запроса статуса задания, чтобы увидеть, выполнено ли оно. Вы можете сделать это, организовав для задания обновление строки в таблице, когда это будет сделано.