Среднего размера файлы (5 мегабайт) записанные при помощи file_put_contents - читаются обычным HDD где-то в 4-5 раз медленней, чем записанные при помощи Far Manager. При этом в процессе их чтения головки трещат, что говорит о фрагментации файлов. Почему file_put_contents фрагментирует файлы, и можно ли как-то записывать файлы без фрагментации? OS: Win 8.1 с апдейтами, Win 7 без апдейтов PHP 7, запускается из консоли - но я думаю под другим ОС тоже будет фрагментация
Это как перезаписывает файл по дефолу? Как бы изначально файла то не было. Я для теста из дириктории data скопировал файлы в пустую дирикторию data2 при помощи file_put_contents, и в пустую дирикторию data3 при помощи Far manager. Перегрузил ОС, и имею скорость чтения из data2 в 4-5 раз медленней чем из data3
...не у всех ОС в их ФС есть понятие фрагментации файлов ... у FAR, насколько помню есть параметр - использовать системные функции при копировании (попробуйте с ним и без записать) + путаете понятия - создание файла, и копирование файла .... можете копировать средствами php (copy) и сравнить скорость (и звуки) ...с FAR Вообще все что происходит на уровне ФС - на это обычно приложения и ПО не влияют (в редких случаях) .... ну и какбэ все хе веб и php лучше себя чувствуют в nix
Ээ.. что такое FAF ? У меня самая обычная ntfs... Есть у меня нехорошее подозрение... что php просто пишет мелкими блоками постепенно увеличивая длину файла (из-за чего происходит фрагментация), вместо того, чтобы в случае с большими файлами сперва выделить место под файл, и только потом писать, а в случае с небольшими писать одним куском. Если оно так, то ФС не поддерживающая фрагментацию файлов (не знал что такие бывают) на записи просто захлебнется..
FAR ничего не фрагментирует, как с включенным "Use system copy routine", так и с выключенным. PHP фрагментирует в обоих вариантах (хотя на него это вряд ли влияет)))) Звуки не во время копирования, а при чтении скопированных файлов (после перезагрузки). И вот чего-то я не пойму, какая разница с точки зрения фрагментации - скопировать файл, или записать. 2 дня пробовал с линуксом играться... по моему штука еще более глюкавая чем винда. У минта даже интерфейс рябит... (лень искать скрин), а у Убунты софт не самый идеальный по качеству.. Дебиан не ставил... Ну затестите на Линуксе.. дело то несложное если есть HDD... Создать 100 файликов по 10 метров, перезагрузиться, прочитать.. Я только потому к SSD и присматриваюсь, что сперва криворукие программисты Гугла, а потом и все остальные, положили болт на оптимизацию для HDD. SSD, ежели не ошибаюсь, стирают блоками по 2 мегабайта. И я вот что-то пока не видел тестов на скорость случайной перезаписи SSD блоками пускай даже по 128кб, при его заполненности скажем на 80%, в режиме 24 на 7. Предполагаю, скорость будет на уровне обычного HDD. Тут спасет Intel Optane, но на 500 гигов Intel Optane у меня нету денежек..
как ты вообще до сих пор живёшь без ссд --- Добавлено --- нафига так много? сервак арендуй, если надо если разово - можно и подождать если часто - должно окупаться, иначе нафиг такую деятельность
Ну иногда подбешивает, что браузер открыватся 10 секунд потому как делает очень много обращений к диску, вместо 3-5, но делает он это 1 раз за день (потом все в кэше сидит). А так нормально. Я вот не понимаю людей, кто живут на SSD менее 500 гигов. Ну и денег на востановление данных с SSD у меня нету (40т.р. кажется), тогда как с HDD есть (10т.р.) --- Добавлено --- Ну я недавно чистил HDD, У меня 300 гигов занято на нем. 500 гигов самый минимум.
файлы созданные php copy такие же фрагментированные как и те, что созданы file_put_contents Я времени на таскание данных туда-сюда и вспоминание где киношки где что, потрачу больше, чем утром почистить зубы, пока superfetch запишет в оперативку большую часть нужных мне данных. С такой системой сжатия, 128гб под проекты мне не хватит, даже 512 может не хватить, если проект окажется большим.. Я не нашел вменяемой системы резервных копирований (ну кроме может быть бекблейз, которая стоит 600 долларов за 10 лет, и которую я по этой причине еще не тестил), а ssd это, имхо, больший риск. Если сломалось устройство - то ценник на извлечение данных раз в 5 выше, а если вирь, то hdd заметить есть шансы пока тот шифрует, а ssd нет. SSD штука хорошая, но только объемом не менее 500 гигов (а лучше больше), и в сочетании ну хотя бы с бекблейз (600 долларов за ожидаемое время жизни накопителя).
Никогда не озадачивался такой темой, но наверное разница между результатом в Фар и ПХП в том, как они резервируют место. Попробуй в ПХП после создания файла сразу задать его конечный размер - Фар при копировании может так сделать.
https://stackoverflow.com/questions/3608383/php-create-file-with-given-size https://stackoverflow.com/questions/8184027/algorithm-to-generate-a-large-dummy-file --- Добавлено --- Не забывай плюсовать
это ты, брат, нудишь торренты качаются сразу на хард, проекты живут сразу на ссд, игрушки - как получится
Ну тот код проблему не решает... просто дописывает нули в начало файла.. но направление интересное.. может удастся что выкопать в нем... попробую... кодировка - вряд ли))) --- Добавлено --- Я все скачиваю на рабочий стол))) Ну и вообще, сейчас цены на SSD такие, что 512 стоит не многим дороже, чем 128 + HDD. Так что смысла особо нет...
В общем после некоторой модификации все работает как надо. Спасибо за ссылочки. PHP: function file_put_contents_no_fragmentation($filename,$data) { $fp=fopen($filename,'w'); fseek($fp, strlen($data)-1,SEEK_CUR); fwrite($fp,'a'); fseek($fp, -strlen($data),SEEK_CUR); fwrite($fp,$data); fclose($fp); } - но я вот не знаю... двойная запись.. нормально или нет. hdd то фиолетово - он записать не успевает, а ssd может и успеть записать, а у него с перезаписью плохо)))
Тот коды выше, проблему решает лишь частично. Сперва происходит запись файла нужного размера (строка 5), а потом его перезапись (строка 7). На SSD уже протестировал, скорость записи от этого деяния падает в 2 раза (читаются с ssd такие файлы одинаково с теми, что просто пишутся file_put_contents, зато стираются быстрее). Теоретически это так же должно увеличивать нагрузку на сборку мусора (файлы стертые после file_put_contents создают ещё большую нагрузку на сборку мусора). Мм.. я думаю стоит признать, что это фундаментальная недоработка PHP, и способов её решения нет (так, чтобы перед записью в файл, был создан файл нужного размера в файловой системе, но при этом запись на поверхность на этом этапе не проводилась). И решаться скорее всего не будет, потому как на ssd file_put_contents фрагментирующий файлы не дает видимого негативного эффекта (хотя на серваке постоянно перезаписывающим данные фрагментация ssd ведет к существенному снижению средней (за сутки) скорости записи). С другой стороны разработчикам пхп внедрить этот функционал вряд ли бы стоило более 10-ка часов работы.
Может проблема в синхронности PHP, можно например не записывать 100 файлов за один запуск PHP, а организовать 100 запусков с записью одного файла по счетчику до 100. А так PHP сам по себе ничего не пишет, а отправляет команды в систему через С++ на котором он написан.
Вы точно определили, что проблема именно в фрагментации(ntfs не так ей подвержена, как принято об этом думать)? попробуйте на раздел с ext fs писать, но если честно -- вряд-ли проблема с фрагментацией, можете ещё перед записью в файл формировать данные в ОЗУ и лишь по окончанию их сливать.
я в винде сижу. А какие еще варианты есть? Что значит не так подвержена? Если сперва записать файл на 32кб, потом к нему добавить 32кб, потом еще 32кб, и т.д. то файл вполне может получиться фрагментированным. Это как вы себе средствами пхп представляете?? --- Добавлено --- в первоначальном коде между записью файла и записью следующего проходило около полусекунды. ПХП неотличимо от сразу скидывает все на диск. который отправляет команды в операционную систему, которая отправляет команды конроллеру.
драйвер поставьте... посмотрите хэксредактором физическое количество и расположение фрагментов эмм, тут вопрос, как Вы формируете файлы и какого они размера, суть в том, что, если грубо -- формируете большую строку (с переносами и т.д. и т.п.) , без кода и исходных данных тут сложно советовать, но самая простая ситуация, если Вы, например, пишите в файл по переносу строки, вместо того , чтобы сформировать одну переменную строкового типа с переносами и другими символами форматирования и запихнуть её в файл за одну операцию записи(там есть ограничение по длине, если не путаю, вот по нему и разбивать в цикле).