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

Добрый день.
Получаю от стороннего ресурса массивы с числами.
Задача в том, чтобы сравнить два таких массива с помощью, например, array_intersect.
Проблема в том, что этих чисел в массиве могут быть миллионы. И процессов этих может быть несколько в единицу времени.
Подскажите, пожалуйста, как организовать работу таким образом, чтобы оно не поело всю память.
  • Вопрос задан
  • 1165 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Я думаю, самым разумным решением будет писать эти массивы в базу и сравнивать простым запросом. Именно так в общем случае решается задача "сравнение двух больших массивов данных на РНР." Конкретную же реализацию можно будет предложить только если будет конкретный вопрос, без "может быть " и "например".

Да, память в БД тоже не бесплатная, но тут надо уже определиться - или мы хотим ворочать гигазы варезов, или сидеть на копеечном впс с 500 метрами памяти. Одновременно не получится.

Можно конечно извернуться и скомпилить специальное расширение, которое как раз и предназначается для работы с иллимонами элементов, но опять же - все зависит от возможностей и потребностей.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега PHP
♬♬
Чтобы не в памяти, можно на диск. Сохранить массив чисел в файл. Для компактности как бинарный файл, по 4 байта на число pack() (если это 32-битные id ВКонтакте вы сравниваете. Facebook id — лонги). Отсортированным. Тот же ВК умеет отдавать список сортированным. Сохранить так же второй.

Открыть оба файла, считать fread($fh, 4) из каждого по числу: число А, число Б.
А больше Б ? Читаем новый Б.
Б больше А ? Читаем новый А.
Равны? Ура, это число сохраняем в «пересечение». Читаем новый А и новый Б.
Закончился один из файлов — пересечений больше нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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