Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перебор очень больших массивов. Проблема!
 
 автор: Sl   (26.11.2008 в 10:29)   письмо автору
 
 

Имеются 2 массива. Они очень большие. В одном хранится 20 000 элементов, в другом 16 000.

$files = array(20000);
$links = array(16000);


Задача: Каждый элемент массива $files нужно сравнить со всеми элементами массива $links. Т.е нужно найти все элементы массива $files которые отсутствуют в массиве $links

Данную задачу я выполнил. Но выходит фатальная ошибка

Fatal error: Maximum execution time of 30 seconds exceeded


Если брать размерность меньше до 5000, все работает прекрасно. Даже не знаю что и делать.

Я даже переписал скрипт таким образом, чтобы сравнение элементов происходило поэтапно. Сравнивал элементы массивов с шагом например в 100 элементов (шаг сравнения можно самому задавать), но и это не помогло

Как можно решить проблему? Если что могу кинуть сам скрипт

P.S необходимость в больших массивах необходима. В массив $files я забиваю все файлы, которые хранятся на фтп. В $links накапливаются нужные мне данные из БД

  Ответить  
 
 автор: sim5   (26.11.2008 в 10:31)   письмо автору
 
   для: Sl   (26.11.2008 в 10:29)
 

А как вы их сравнивали?

  Ответить  
 
 автор: Sl   (26.11.2008 в 10:37)   письмо автору
 
   для: sim5   (26.11.2008 в 10:31)
 

Каждый элемент массива $files сравнивается со всеми элементами массива $links. Если элемент найден обрываем цикл, если же нет ищем дальше по циклу. Сравнение происходит частями. Сначала сравниваются например 100 элементов массива потом от 100 до 200 и т.д.

  Ответить  
 
 автор: sim5   (26.11.2008 в 10:43)   письмо автору
 
   для: Sl   (26.11.2008 в 10:37)
 

Не пробовал такие громадные массивы гонять, но, вы пробовали стандартными функциями РНР производить сравнение?

  Ответить  
 
 автор: Sl   (26.11.2008 в 10:45)   письмо автору
 
   для: sim5   (26.11.2008 в 10:43)
 

Пытался с foreach - безнадежно. Сам скрипт на for работает

  Ответить  
 
 автор: sim5   (26.11.2008 в 10:52)   письмо автору
 
   для: Sl   (26.11.2008 в 10:45)
 

Да какой foreach!? Посмотрите функции работы с массивами, для сравнения их не одна функция имеется.

  Ответить  
 
 автор: elenaki   (26.11.2008 в 10:37)   письмо автору
 
   для: Sl   (26.11.2008 в 10:29)
 

увеличить время выполнения скрипта в файле php.ini или httpd.conf.
max_execution_time = [целое число] - указывает время в секундах

  Ответить  
 
 автор: Sl   (26.11.2008 в 10:40)   письмо автору
 
   для: elenaki   (26.11.2008 в 10:37)
 

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

Может быть можно как-то в самом php-файле попробовать изменить?

  Ответить  
 
 автор: elenaki   (26.11.2008 в 10:46)   письмо автору
 
   для: Sl   (26.11.2008 в 10:40)
 

set_time_limit($time)

  Ответить  
 
 автор: Valick   (26.11.2008 в 10:49)   письмо автору
 
   для: Sl   (26.11.2008 в 10:40)
 

Прислушайтесь к совету sim5. Используйте стандартные функции.
необходимость в больших массивах необходима
А мне кажется эту же задачу можно решать средствами СУБД поместив названия файлов с фтп в БД во временную таблицу.

  Ответить  
 
 автор: Sl   (26.11.2008 в 10:52)   письмо автору
 
   для: Valick   (26.11.2008 в 10:49)
 

а какие можно функции стандартные использовать при сравнении не подскажите?

  Ответить  
 
 автор: sim5   (26.11.2008 в 10:54)   письмо автору
 
   для: Sl   (26.11.2008 в 10:52)
 

http://ru2.php.net/manual/ru/ref.array.php

  Ответить  
 
 автор: Sl   (26.11.2008 в 10:58)   письмо автору
 
   для: sim5   (26.11.2008 в 10:54)
 

спасибо, буду думать

  Ответить  
 
 автор: Trianon   (26.11.2008 в 11:02)   письмо автору
 
   для: Sl   (26.11.2008 в 10:58)
 

если элементы $files держать в ключах, а не в значениях, достаточно одного прохода по $links (или даже по его источнику, без создания самого массива $links)
Задача решится достаточно быстро.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования