Задать вопрос
@life_fox

Как средствами php сравнить два больших массива?

Здравствуйте, добрые люди.

Задача: имеется
- папка с картинками (примерно 500 мб)
- база данных(таблица) в которой указаны название картинок (MySQL - 100 тыс. строк)

Надо сравнить название картинок из папки с базой данных и выявить лишние названия картинок

Буду очень благодарен.
Заранее спасибо.
  • Вопрос задан
  • 5003 просмотра
Подписаться 3 Оценить 2 комментария
Решения вопроса 1
@kaasius
Воу-воу, палехчи. Это всё очень круто. Но имеет избыточную сложность, особенно в плане расхода памяти. Как бы сделал я:
1. Сделал бы список файлов в папках (find /path/to/folder -name "*.jpg" >filelist.txt)
2. Грузим в php скрипте файлик file("filelist.txt") - он при этом грузится как массив. Алсо, чтобы экономить память, можно читать через fgets - немного сложнее, но зато веселее.
3. Пробегаем по этому массиву и ищем в БД. Поле с именем файла должно быть индексировано конечно.
Все файлы, что не найдены, удаляем.

Альтернативный вариант - загрузить из БД все записи в виде хеш-таблицы (то есть имена из БД должны стать индексами массива, а значениями - да что угодно). Дальше поиск производить как isset($hash[$name]).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
konst20
@konst20
Программист, преподаватель, немного электронщик
1. Формируем массив array1 - имена файлов в папке - ф-я scandir

2. Формируем массив array2 - названия в БД, выборка наподобие
SELECT image_name FROM my_db
выбираем только имена image_name, то есть названия.

Форматы названий должны совпадать, то есть одинаковые картинки и в БД, и в папке должны иметь абсолютно одинаковые имена, с учетом того, что файлы в папке имеют еще и расширения. Если что - приводим строковыми ф-ями к одинаковому формату (отрезаем расширение файла например)

3. Ф-я array_diff(array1, array2) даст те элементы, которые есть в массиве array1, но нет в массиве array2.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
1. Получить список файлов из папки.
2. Получить список файлов из базы.
3. Отсортировать оба списка по алфавиту (можно прямо на шагах 1 и 2, но надо чтобы порядок сортировки был одинаковым).
4. Построчно сравнивать списки, отмечая те строки, которые есть только в одном списке.
Ответ написан
Комментировать
В базу добавляем поле-ключ "найдено/не найдено", делаем поле с названием файла тоже ключевым. Далее создаём список файлов и начинаем поиск по базе среди "не найденых" изображения. Найденные изображения помечаем.
Ответ написан
Комментировать
Не понял, Вам решить эту задачу надо? Или, подсказать решение?
Если решить, то, я думаю - Вам лучше на фрилансим сходить - Вам там за пару единиц с двумя нулями - Вам эту задачу решат.

Если просто подсказать:
Ну тут, особо ничего сложного.
Самое просто решение:
Бегите по строкам в таблице в БД. Проверяйте есть такой файл или нет. Если нет, сохраняйте решение куда-либо.
Ответ написан
Комментировать
konst20
@konst20
Программист, преподаватель, немного электронщик
Я обращу внимание на то, что предлагавшиеся выше решения в духе "бегите по строкам" и "построчно сранивайте" в данном случае имеют сложность до О(n*n), то есть придется сделать 100000*100000 = примерно 10 миллардов операций.
боюсь, это может затянуться на несколько часов.
Ответ написан
Вам стоит обратить внимание на стандартную библиотеку примитивов SPL.
FixedArray и RecursiveDirectoryIterator помогут значительно ускорить обработку.
Также через pcntl_fork или pthread'ы можно распределить задачу по нескольким потокам или процессам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы