ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Что будет быстрее работать?(теория)
  #1  
Старый 05.11.2008, 23:56
Аватар для EST a1ien
EST a1ien
Участник форума
Регистрация: 02.04.2006
Сообщений: 273
Провел на форуме:
1269624

Репутация: 114
Отправить сообщение для EST a1ien с помощью ICQ
По умолчанию Что будет быстрее работать?(теория)

Есть некая структура файлов(котороя не обновляется и не изменяется, просто папки и файлы).
Мне надо реализовать навигацию по этим файлам. Просто включить Options +Indexes не устраивает.

Собственно что будет быстрее работать.
Если мы загоним весь список файлов в базу(не сами файлы а просто их иерархию) и будем просто вытаскивать из базы.
Или будем через system('ls') ползать?

Или еще чтонибудь предложите?

ЗЫ пока писал вспомнил про opendir/readdir. он наверно будет быстрее?

Последний раз редактировалось EST a1ien; 06.11.2008 в 00:00..
 
Ответить с цитированием

  #2  
Старый 06.11.2008, 00:04
Аватар для Chaak
Chaak
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме:
5321514

Репутация: 3313


Отправить сообщение для Chaak с помощью ICQ
По умолчанию

База медленная штука. Используй readdir();
 
Ответить с цитированием

  #3  
Старый 06.11.2008, 00:22
Аватар для nerezus
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

Базу юзай. Чтобы рекурсивно не лазить по директориям. Легче гораздо это. Да и теоретически быстрее.

Хотя для твоего проекта все равно - он не будет настолько популярным, чтобы замечать разницу.
 
Ответить с цитированием

  #4  
Старый 06.11.2008, 00:38
Аватар для mr.The
mr.The
Познавший АНТИЧАТ
Регистрация: 30.04.2007
Сообщений: 1,206
Провел на форуме:
4778940

Репутация: 1257


Отправить сообщение для mr.The с помощью ICQ
По умолчанию

база имхо.
к теме надо опрос прикрутить =\
 
Ответить с цитированием

  #5  
Старый 06.11.2008, 01:20
Аватар для nerezus
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

не нужен опрос. Да и автор не знает походу, что ему надо.
 
Ответить с цитированием

  #6  
Старый 06.11.2008, 11:20
Аватар для EST a1ien
EST a1ien
Участник форума
Регистрация: 02.04.2006
Сообщений: 273
Провел на форуме:
1269624

Репутация: 114
Отправить сообщение для EST a1ien с помощью ICQ
По умолчанию

nerezus что ты на меня сразу набросился?

Цитата:
Хотя для твоего проекта все равно - он не будет настолько популярным, чтобы замечать разницу.
Я не говорил нечего не про какой проет. Мне просто интересно что в данному случае лучше.
Кстати ненадо получать рекурсивно список файлов. Нужно только список из папки/подпапки.
А нагрузка будет хотябы потому что файлов в папки будет порядка 500 штук(возможно больше)
Цитата:
не нужен опрос. Да и автор не знает походу, что ему надо.
И опять ты на меня накинулся. Такое впечатление будто я тебя прошу за меня что-то писать или сделать.

ЗЫ уже двое за базу. Кстати можно еще прокешировать запрос к базе(так-как инфа меняться будет ну очень редко)

Последний раз редактировалось EST a1ien; 06.11.2008 в 11:23..
 
Ответить с цитированием

  #7  
Старый 06.11.2008, 11:52
Аватар для ++Norton++
++Norton++
Участник форума
Регистрация: 20.11.2006
Сообщений: 172
Провел на форуме:
539954

Репутация: 106
По умолчанию

Тоже за базу. Должно быть быстрее.
 
Ответить с цитированием

  #8  
Старый 06.11.2008, 15:47
Аватар для Trieg
Trieg
Познающий
Регистрация: 26.10.2007
Сообщений: 83
Провел на форуме:
394231

Репутация: 50
По умолчанию

бд полюбому будет лучшим вариантом.. 500 файлов постоянно дергать неудобно + с бд больше возможностей
 
Ответить с цитированием

  #9  
Старый 11.11.2008, 18:38
Аватар для Red_Red1
Red_Red1
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме:
4608122

Репутация: 874
Отправить сообщение для Red_Red1 с помощью ICQ
По умолчанию

Пока уезжал тема упала, ну да ясно что тут долго обсуждать.
Предлагаю свой вариант "что бы быстрее".

Нам в любом случае понадобиться отсканить директории что бы мы не использовали базу или файл.
Хранить дерево предлагаю в массиве такой структуры
Код:
Array
(
    [0] => file1
    [1] => file2
    [2] => file3
    [DIR1] => Array
        (
            [0] => file1
            [1] => file2
        )
    [DIR2] => Array
        (
            [0] => file1
            [1] => file2
            [2] => file3
            [SUBDIR1] => Array
                (
                   [0] => file1
                   [1] => file2
                   [2] => file3
                )
        )
Дальше мы можем сериализовать массив (serialize) и засунуть строку в файл. Потом грузить массив из файла и пользоваться им для навигации. Можно положить строку сериализованого массива в базу. Тут вопрос, база данных ведь тоже представляет собой файл(ы) получается мы будем обращаться к файлам в любом случае, так какая разница что использовать базу или файл? (очень хочу узнать ответ : )) Хотя можно в базе хранить дерево не одной записью, а несколькими, тогда смысл может и будет, выигрываем в объеме загружаемых данных.
Далее, начинаем ускорять это дело. Мысль такая использовать кеширование в памяти. Т.е. будем хранить в памяти на сервере массив дерева каталогов при необходимости берем массив сразу из памяти, а не с файла/базы.
Объем памяти потребуется относительно небольшой.
Вот примерный расчет взят с моего диска С. Общее количество файлов и папок 14000 (установлена винда ХП, офис, и несколько других программок). Возьмем среднее количество букв в имени файла/папки равным 15 (символов). Итого имеем 14000*15=210000 (байт-символов) или 205 килобайт. Много мало решать вам.
Теперь все это в коде.
1. Сканер директорий.
PHP код:
 <?php
$memcache 
= new Memcache();
$memcache->pconnect('127.0.0.1'11211);//Подключаем сервер кеша

function dir_tree($root)//Рекурсивная функция для сканирования директории. Возвращает массив-дерево
  
{
    
$res = array();$root .= '/';
    
$dirs scandir($root);
    foreach(
$dirs as $name){
      if(
is_dir($root.$name)){
        if(
$name == '.' || $name == '..'){
          continue;
        }
        
$res[$name] = dir_tree($root.$name);
      }else{
        
$res[] = $name;
      }
    }
   return 
$res;    
  }

  
$root = isset($_GET['root']) ? $_GET['root'] : '';
  
$root substr($root,0,1) == '|' substr($root,1) : $root;
  
$scan = isset($_GET['scan']);
  if(
$scan){
    
set_time_limit(0);
    
$tree=dir_tree($root);//Получаем массив-дерево
    
file_put_contents('d:/dir.txt',serialize($tree));//Сохраняем в файл полученый массив-дерево (можно не делать если не будем использовать файлы)
    
$memcache->set('all_data_m'$treefalse60000);//Сохраняем массив в кеше (если будем работать через кеш. Не забыть выставить нужное время!)
    
echo "Ok!";
   }
  
echo 
"<FORM ><INPUT type=text name = root><br />//Форма в которой укаываем диру для построение дерева.
  <input type =hidden name=scan value=1>
  <input type=submit value=scan></FORM><br />"
;
?>
2. Скрипт навигации на основе массива дерева каталогов используя кеш в памяти.
PHP код:
 <?php
$memcache 
= new Memcache();
$memcache->pconnect('127.0.0.1'11211);//Конект  к кешу
 /**
  * function array_getbranch Возвращает указанный элемент массива
  * т.е. преобразовывает строку вида dir1|dir2|...|dirN в $var[dir1][dir2]...[dirN] - массив
  * Уровни массива в строке разделяются |
  * Если данного элемента нет, то вернет NULL
  *$branch string Строка-путь к элементам
  * $arr array|null Массив для обработки, если NULL, то вернет только "строку доступа" ([a][b][c]...), а не значение
  *  c данного массива
  * @return mixed Указанный узел/"строка доступа"/NULL(если ветка с ошибками или не существует такого элемента)
  */
function array_getbranch($branch,$arr null)
 {
  if(
$branch != '' && !preg_match("/^(?:\[\'[\w\d\- ]+\'\])+$/",$branch "['".str_replace('|',"']['",$branch)."']"))
   {
    return 
null//если ветка не пустая и в ней ошибка -> результат уже ясен
   
}
  return 
is_null($arr) ? $branch : eval("return @\$arr$branch;");
 }  

// ----------- Засекаем время -{Начаало}----------------------------
$mtime microtime();
$mtime explode(" ",$mtime);
$mtime $mtime[1] + $mtime[0];
$tstart $mtime;
// ------------ Засекаем время {Конец}------------------------
  
  
$root = isset($_GET['root']) ? $_GET['root'] : '';
  
$root substr($root,0,1) == '|' substr($root,1) : $root;
  
  
$tmp $memcache->get('all_data_m');//Берем из кеша массив
  
$data array_getbranch($root,$tmp);//Получаем нужный элемент массива по параметру  $root (dir1|dir2|...|dirN)
  
  
echo "<PRE>";
  
//print_r ($data);
  
$ret substr($root,0,strrpos($root,'|'));
  echo 
'"'.str_replace('|','\\',$root)."\"<br />";
  echo 
"<br /><A href = \"?root=$ret\">..</A><br />" ;
  foreach(
$data as $key=>$value)//Выводим в браузер содержимое каталога.
   
{
    echo 
"<br />";
    if(
is_array($value)){
      echo 
"<A href=\"?root=$root|$key\">$key</A>";
    }else{
      echo 
"$value";
    }
   }

// ------- считаем пройденное время --------------Начало
$mtime microtime();
$mtime explode(" ",$mtime);
$mtime $mtime[1] + $mtime[0];
$tend $mtime;
$totaltime ceil(($tend $tstart)*10000)/10000;
$time='<br />Страница сгенерирована за '.$totaltime.' секунд.';
// ------- считаем пройденное время --------------Конец
echo $time;
?>
Первый скрипт запускаем один раз для сканирования, а вторым пользуемся для навигации. Если структура каталогов изменилась, то снова нужно запустить сканирование.
Можно сделать разные проверки и прочее, но это нужно уже для конкретной задачи.
Вот такое вот решение. Интересно услышать критику.
З.Ы.
Для использования кеша придется установить memcache. Очень коротко почитать можно тут
http://www.webnext.ru/blog/2007/09/18/php-memcache.html
Есть версия для винды (ей и пользовался)
http://jehiah.cz/projects/memcached-win32/
 
Ответить с цитированием

  #10  
Старый 11.11.2008, 22:39
Аватар для fucker"ok
fucker"ok
Познавший АНТИЧАТ
Регистрация: 21.11.2004
Сообщений: 1,137
Провел на форуме:
2487541

Репутация: 761


По умолчанию

А что ты мучаешься. один тест у тебя уже сделано напиши второй и для БД =)

Я думаю что БД быстрее т.к. хранить в каждом запущенном скрипте структуру из 14к элементов - накладно.
Да и в БД есть тоже свой кеш, который можно настроить.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Социальная инженерия. Профессиональное программирование. Последовательный взлом dinar_007 Болталка 15 23.12.2008 12:30
Мудрые уроки YoYo Factory Болталка 14 04.06.2008 09:21
Взлом Windows-сетей от Microsoft otmorozok428 Чужие Статьи 3 24.04.2008 16:18



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ