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

Форум PHP

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

 

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

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

тема: Ускорение чтения файлов в папках
 
 автор: Udachix   (04.03.2013 в 15:50)   письмо автору
 
 

Добре.

Придумал себе задачу.

1) Создал 1 000 000 директорий.
2) Создал 16 000 000 файлов (в этих директориях по 16 файлов в каждой).
3) Тестирую скорость занесения данных в массив из одного и тоже файла в этих директориях:
for ( $i = 1; $i <= 10000; $i++ )
{
    $file = file ( './files/'.$i.'/string.dat' );
    $array [ ] = $file [ 0 ];
    unset ( $file );
}
Лишь пройдя только 10 000 файлов это уже заняло 99.516304969788 s. по тесту getmicrotime.

Как ускорить этот процесс? Ведь нужно в 100 раз больше данных занести в массив.

  Ответить  
 
 автор: cheops   (06.03.2013 в 21:18)   письмо автору
 
   для: Udachix   (04.03.2013 в 15:50)
 

В реальности такие штуки так не организуют... Либо отражение диска в оперативную память, либо отражение файлов в память на C/C++. PHP для таких задач - не самая лучшая штука. Ну и кроме того, на "холодной" системе все будет тормозить, она разгонится у вас только под нагрузкой. Поэтому то, что вы измеряете довольно далеко от реальности.

  Ответить  
 
 автор: Udachix   (07.03.2013 в 01:08)   письмо автору
 
   для: cheops   (06.03.2013 в 21:18)
 

Кстати, да, как это я сам не подумал о другом языке. А на сколько быстрее это выполнялось бы на C++?

  Ответить  
 
 автор: cheops   (07.03.2013 в 07:27)   письмо автору
 
   для: Udachix   (07.03.2013 в 01:08)
 

Опять же зависит от организации и "разогрева", в первый раз будет везде медленно, потом, индексы файла переместятся к кэш в оперативную память, будет быстро. В среднем C/C++ быстрее PHP на три порядка (в 1000 раз), но в случае жесткого диска на это лучше не рассчитывать: будет быстрее, но на сколько, нужно измерять, так как здесь узкое место жесткий диск. Почему и стоит в таких случаях сразу думать об отражении файловой системы в оперативную память или об SSD.

PS На практике редко упираются в супер проблему, которую потом героически решают, любым способом вплоть до написания своей файловой системы (лишь бы не на йоту не отходить от начального задания). Как правило, хитрят, обходят, переформулируют задачу. Море мелких файлов и на диске? Значит должен быть либо отдельный индекс, либо база данных, и конечно же в оперативной памяти и желательно, чтобы 80% системы было готово и отлажено до начала процесса программирования.

  Ответить  
 
 автор: Udachix   (07.03.2013 в 08:51)   письмо автору
 
   для: cheops   (07.03.2013 в 07:27)
 

При индексирование я тоже задумывался. Хотел реализовать так, чтобы некий cron, выполнял поиск по 100 000 папок (хотя бы) раз в час, и записывал в новый отдельный единый текстовый документ. То есть в 00:00 > 1 - 100000 папок, в 01:00 > 100001 - 200000 папок и так далее. Таким образом дня бы хватило, чтобы проиндексировать 2 400 000 папок, но тут оказалось, что и с 10 000 долго за раз. Вот только в своём примере, я это делал лишь с одним файлом из папки, а здесь бы открывал минимум три, что ещё бы усугубило положение.

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

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