|
|
|
| Добре.
Придумал себе задачу.
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 раз больше данных занести в массив. | |
|
|
|
|
|
|
|
для: Udachix
(04.03.2013 в 15:50)
| | В реальности такие штуки так не организуют... Либо отражение диска в оперативную память, либо отражение файлов в память на C/C++. PHP для таких задач - не самая лучшая штука. Ну и кроме того, на "холодной" системе все будет тормозить, она разгонится у вас только под нагрузкой. Поэтому то, что вы измеряете довольно далеко от реальности. | |
|
|
|
|
|
|
|
для: cheops
(06.03.2013 в 21:18)
| | Кстати, да, как это я сам не подумал о другом языке. А на сколько быстрее это выполнялось бы на C++? | |
|
|
|
|
|
|
|
для: Udachix
(07.03.2013 в 01:08)
| | Опять же зависит от организации и "разогрева", в первый раз будет везде медленно, потом, индексы файла переместятся к кэш в оперативную память, будет быстро. В среднем C/C++ быстрее PHP на три порядка (в 1000 раз), но в случае жесткого диска на это лучше не рассчитывать: будет быстрее, но на сколько, нужно измерять, так как здесь узкое место жесткий диск. Почему и стоит в таких случаях сразу думать об отражении файловой системы в оперативную память или об SSD.
PS На практике редко упираются в супер проблему, которую потом героически решают, любым способом вплоть до написания своей файловой системы (лишь бы не на йоту не отходить от начального задания). Как правило, хитрят, обходят, переформулируют задачу. Море мелких файлов и на диске? Значит должен быть либо отдельный индекс, либо база данных, и конечно же в оперативной памяти и желательно, чтобы 80% системы было готово и отлажено до начала процесса программирования. | |
|
|
|
|
|
|
|
для: cheops
(07.03.2013 в 07:27)
| | При индексирование я тоже задумывался. Хотел реализовать так, чтобы некий cron, выполнял поиск по 100 000 папок (хотя бы) раз в час, и записывал в новый отдельный единый текстовый документ. То есть в 00:00 > 1 - 100000 папок, в 01:00 > 100001 - 200000 папок и так далее. Таким образом дня бы хватило, чтобы проиндексировать 2 400 000 папок, но тут оказалось, что и с 10 000 долго за раз. Вот только в своём примере, я это делал лишь с одним файлом из папки, а здесь бы открывал минимум три, что ещё бы усугубило положение. | |
|
|
|