@codercat

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

Как правильно, например, находить общие значения в огромных массивах (100-500к значений) так, чтобы это не занимало много ресурсов?

Если делать это обычным способом, то на выходе получается очень нагруженный процесс. Возможно, следует выбрать другой язык (не знаю, насколько php приспособлен для таких задач) или как-то по-другому спроектировать, например разделить на множество небольших массивов?
$arr1 = [];
$arr2 = [];

for($i = 0; $i <= 400000; ++$i) {
	$arr1[] = rand(1000000, 100000000);
	$arr2[] = rand(1000000, 100000000);
}

$out = array_intersect($arr1, $arr2);

e020c38a25164271a0daa59b2af582b4.jpg
  • Вопрос задан
  • 1049 просмотров
Решения вопроса 1
@lyeskin
Ну для таких случаев подходит хорошо другая структура - множества (sets). Они есть в питоне, например. Работают гораздо быстрее за счет неупорядоченности и уникальности значений.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@yuras666
в php есть SplFixedArray - он съест меньше памяти. Имхо ты пытаешься повесить на php то, что ему делать не положено. Я бы реализовал эту логику на стороне того, кто хранит эти данные, например mysql. Если тебе нужно найти пересечения множеств, очень удобно использовать пересечения в redis.
Ответ написан
Значения добавляйте как $arr[$i] = true и делайте пересечение по ключам, array-intersect-key кажется. По сути это реализация множества.
Ответ написан
@shagguboy
писать на любом языке(ну или библиотеке - для питона Theano) который поддерживает поточные операции процессора, с учетом работы этих самых операций.
Ответ написан
@codercat Автор вопроса
Попробовал сделать тоже самое на pyton по совету lyeskin , возможно неправильно. Результат получше, конечно, но всё равно не назвал бы его удовлетворительным e7e29cb53b094a7e8cd01f70c0dd2bd5.png
import random
set1 = set()
set2 = set()
i = 0

while i < 400000:
        set1.add(random.randint(1000000, 10000000))
        set2.add(random.randint(1000000, 10000000))
        i = i+1;

print set(set1).intersection(set2)
Ответ написан
@SeptiM
Отсортируйте и напишите линейный алгоритм для пересечения отсортированных массивов. array_intersect скорее всего работает квадрат и потому все грузит.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы