Это простой алгоритм.
- Flip 1-й массив.Значения станут ключами.Поэтому повторяющиеся значения будут отброшены.
- Отразить 2-й массив (необязательно)
- Проверить наличие каждого элемента во 2-м массиве, если он существует в 1-м массиве.
Поскольку вы работаете с очень большими массивами, потребляет много памяти .
Вот моя реализация,
$a = file("l.a"); // l.a is a file contains 2,500,000 lines
$b = file("l.b");
function large_array_diff($b, $a){
// Flipping
$at = array_flip($a);
$bt = array_flip($b);
// checking
$d = array_diff_key($bt, $at);
return array_keys($d);
}
Я запустил ее, используя 4G
ограничение памяти.3G тоже работает.Только что протестировано.
$ time php -d memory_limit=4G diff_la.php
Это заняло около 11 секунд! .
real 0m10.612s
user 0m8.940s
sys 0m1.460s
ОБНОВЛЕНИЕ
После запуска кода в 2 раза быстрее, чем указанная выше функция large_array_diff
.
function flip_isset_diff($b, $a) {
$at = array_flip($a);
$d = array();
foreach ($b as $i)
if (!isset($at[$i]))
$d[] = $i;
return $d;
}
Поскольку она не вызывает array_flip
(1 раз), array_diff_key
и array_keys
.Благодаря этому сохраняется много циклов ЦП.