Сравнение больших массивов

guest11

Новичок
Сравнение больших массивов

Надо найти разность двух массивов. Сделано это сейчас так:

$arr_2 = array_map('check_arr', $arr_2);
$$arr_1 = array_map('check_arr', $$arr_1);
$arr_2 = array_filter($arr_2, 'filter_arr');
$$arr_1 = array_filter($$arr_1, 'filter_arr');
$arr_diff_21 = array_diff($arr_2, $$arr_1);
$arr_diff_12 = array_diff($$arr_1, $arr_2);
$arr_diff_21 = array_map('check_arr', $arr_diff_21);
$arr_diff_12 = array_map('check_arr', $arr_diff_12);
$arr_diff_21 = array_filter($arr_diff_21, 'filter_arr');
$arr_diff_12 = array_filter($arr_diff_12, 'filter_arr');

Проблема в том, что $arr_1 и $arr_2 содержат 1-1,5 миллиона элементов, а результат - от единиц до десятков тысяч элементов. Скрип поработал несколько дней, а потом начал подвешивать сервер. Можно ли это как-то оптимизировать?
 

Фанат

oncle terrible
Команда форума
может быть, сравнивать не массивы, а что-нибудь другое?
 

Фанат

oncle terrible
Команда форума
у тебя этот массив - самоцель? он изначально присутствует в пхп? ты не знаешь никаких других слов, кроме "массив"?
 

guest11

Новичок
уточни, что значит "кто тебе мешает сравнивать эти строки". чем мой способ плох?
 

kruglov

Новичок
Я так понял, надо не только сказать "равно-не равно", а разницу найти? Для этого есть проработанный алгоритм diff
 

guest11

Новичок
ну там и есть array_diff

-~{}~ 26.08.08 17:14:

может я невнятно написал. поясню на словах.
есть некий сервис дающий для скачивания файл, который содержит большой список наименований (1-1,5 млн. строк). этот список ежедневно обновляется. надо сравнить два списка (текущий и за предыдущий день) и вытащить все что добавилось и что удалилось. вот и все.
 

phprus

Moderator
Команда форума
guest11
Если у тебя в каждом файле каждая запись это строка, то для данной задачи гораздо лушче подходят утилиты sort и comm, так как результаты работы comm будет анализировать на порядок проще чем результаты того что выдаст diff.
 

guest11

Новичок
я не силен в unix'e, но если верить описанию comm не подойдет.

"comm - выдает информацию в следующем формате : первое значение - количество уникальных строк 1-го файла, второе - количество уникальных строк 2-го файла, третье - количество совпадающих строк. "

мне нужны именно отличающиеся данные, а не количество различий/совпадений
 

kruglov

Новичок
я так понимаю, порядок строк при сравнении не имеет значения?
 

guest11

Новичок
строки из первого файла, которых нет во втором по полному совпадению и строки из второго файла, которых нет в первом по полному совпадению (без учета регистра)
 

phprus

Moderator
Команда форума
guest11
"comm - выдает информацию в следующем формате : первое значение - количество уникальных строк 1-го файла, второе - количество уникальных строк 2-го файла, третье - количество совпадающих строк. "
Это ты где такое описание нашел?
Цитата из мана:
With no options, produce three-column output. Column one contains
lines unique to FILE1, column two contains lines unique to FILE2, and
column three contains lines common to both files.
Ни про какие количества тут нет ни слова.
Но comm сравнивает с учетом регистра, так что придется дополнительно приводить строки к нижнему регистру и если тебе понадобятся все 3 колонки comm, то тебе придется удалять из твоих строк символы табуляции.
 
Сверху