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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
nkl
Отправлено: 07 Мая, 2015 - 09:50:33
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Всем привет, имеется массив вида:
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;
Как это сделать быстро легко и непринужденно? Улыбка
 
 Top
Panoptik
Отправлено: 07 Мая, 2015 - 10:27:03
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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


-----
Just do it
 
 Top
nkl
Отправлено: 07 Мая, 2015 - 10:37:14
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Так этот массив из базы и приходит. Пробовал средствами СУБД искать. Окончания работы запроса я так и не дождался. По памяти и скорости процессора беспокоиться не стоит. У нас VDS на ксеоне с 16 гигами ОЗУ)
 
 Top
Panoptik
Отправлено: 07 Мая, 2015 - 10:42:11
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




ну так добавить индекс надо для book_id, name_in_book
а после попробовать уже пробовать запросы

вариант №2

отсортировать весь массив данных по book_id, а в идеале и по name_in_book и выбирать последовательно каждуй группу с одинаковыми бук_ид и искать среди группы одинаковые значения по нейм_ин_бук. задача будет выполняться долго, будет делать много запросов, но зато будет более атомарной и способной паралелиться


-----
Just do it
 
 Top
Мелкий Супермодератор
Отправлено: 07 Мая, 2015 - 10:51:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Вычитывать 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);


-----
PostgreSQL DBA
 
 Top
Panoptik
Отправлено: 07 Мая, 2015 - 10:52:35
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




ну или делать то же самое что и предлагалось изначально, только разделять по ренжам весь массив. к примеру

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

итд

ренж зависит от того насколько много у вас этих бук_ид. возможно порядок нужно будет уменьшить или увеличить


-----
Just do it
 
 Top
nkl
Отправлено: 07 Мая, 2015 - 10:57:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Мелкий пишет:
Вычитывать 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);

Что возвращает это запрос? Дублированные записи? Или что?
 
 Top
Мелкий Супермодератор
Отправлено: 07 Мая, 2015 - 11:00:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Все строки в таблице, для которых сочетание полей book_id, name_in_book по этой таблице не уникально.


-----
PostgreSQL DBA
 
 Top
nkl
Отправлено: 07 Мая, 2015 - 11:09:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Мелкий пишет:
Все строки в таблице, для которых сочетание полей book_id, name_in_book по этой таблице не уникально.

Ок. Спасибо. Достаточно быстро работает.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB