Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как отыскать полностью совпадающие элементы массива
Форумы портала PHP.SU » » Вопросы новичков » Как отыскать полностью совпадающие элементы массива

Страниц (1): [1]
 

1. nkl - 07 Мая, 2015 - 09:50:33 - перейти к сообщению
Всем привет, имеется массив вида:
PHP:
скопировать код в буфер обмена
  1. $array = [
  2.         1 => ['id' => 0,
  3.                 'book_id' => 18,
  4.                 'name_in_book' => 'Bla-bla-bla'],
  5.         2 => ['id' => 1,
  6.                 'book_id' => 17,
  7.                 'name_in_book' => 'Bla-bla-bla'],
  8.         3 => ['id' => 2,
  9.                 'book_id' => 19,
  10.                 'name_in_book' => 'Bla-bla-bla'],
  11.         4 => ['id' => 3,
  12.                 'book_id' => 20,
  13.                 'name_in_book' => 'Bla-bla-bla'],
  14.         5 => ['id' => 4,
  15.                 'book_id' => 20,
  16.                 'name_in_book' => 'Bla-bla-bla'],                              
  17. ];

Массив этот размером over 100 000 000 строк. Мне нужно найти в нем элементы, в которых book_id и name_in_book полностью совпадают. В данном примере будут совпадающими элементы с id 4 и 5 массива $array;
Как это сделать быстро легко и непринужденно? Улыбка
2. Panoptik - 07 Мая, 2015 - 10:27:03 - перейти к сообщению
а засунуть в базу это дело и при помощи инструментов субд не проще будет?
(Добавление)
просто если делать это на чистом пыхе, то массив на 100кк сожрет немало памяти, я уже молчу об прожорливости алгоритмов по поиску и сравнению
3. nkl - 07 Мая, 2015 - 10:37:14 - перейти к сообщению
Так этот массив из базы и приходит. Пробовал средствами СУБД искать. Окончания работы запроса я так и не дождался. По памяти и скорости процессора беспокоиться не стоит. У нас VDS на ксеоне с 16 гигами ОЗУ)
4. Panoptik - 07 Мая, 2015 - 10:42:11 - перейти к сообщению
ну так добавить индекс надо для book_id, name_in_book
а после попробовать уже пробовать запросы

вариант №2

отсортировать весь массив данных по book_id, а в идеале и по name_in_book и выбирать последовательно каждуй группу с одинаковыми бук_ид и искать среди группы одинаковые значения по нейм_ин_бук. задача будет выполняться долго, будет делать много запросов, но зато будет более атомарной и способной паралелиться
5. Мелкий - 07 Мая, 2015 - 10:51:28 - перейти к сообщению
Вычитывать 100 лямов записей сама по себе идея дурацкая.

По индексу book_id & name_in_book должен работать достаточно хорошо:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT /**/ FROM tablename JOIN (
  2. SELECT book_id, name_in_book FROM tablename GROUP BY book_id, name_in_book HAVING count(0) > 1
  3. ) dup USING(book_id, name_in_book);
6. Panoptik - 07 Мая, 2015 - 10:52:35 - перейти к сообщению
ну или делать то же самое что и предлагалось изначально, только разделять по ренжам весь массив. к примеру

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM tbl WHERE book_id BETWEEN 0 AND 100

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM tbl WHERE book_id BETWEEN 101 AND 200

итд

ренж зависит от того насколько много у вас этих бук_ид. возможно порядок нужно будет уменьшить или увеличить
7. nkl - 07 Мая, 2015 - 10:57:54 - перейти к сообщению
Мелкий пишет:
Вычитывать 100 лямов записей сама по себе идея дурацкая.

По индексу book_id & name_in_book должен работать достаточно хорошо:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT /**/ FROM tablename JOIN (
  2. SELECT book_id, name_in_book FROM tablename GROUP BY book_id, name_in_book HAVING count(0) > 1
  3. ) dup USING(book_id, name_in_book);

Что возвращает это запрос? Дублированные записи? Или что?
8. Мелкий - 07 Мая, 2015 - 11:00:39 - перейти к сообщению
Все строки в таблице, для которых сочетание полей book_id, name_in_book по этой таблице не уникально.
9. nkl - 07 Мая, 2015 - 11:09:12 - перейти к сообщению
Мелкий пишет:
Все строки в таблице, для которых сочетание полей book_id, name_in_book по этой таблице не уникально.

Ок. Спасибо. Достаточно быстро работает.

 

Powered by ExBB FM 1.0 RC1