За последние 24 часа нас посетили 22823 программиста и 1234 робота. Сейчас ищут 728 программистов ...

file_put_contents фрагментирует файлы

Тема в разделе "Прочие вопросы по PHP", создана пользователем mirosas, 26 авг 2018.

  1. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Среднего размера файлы (5 мегабайт) записанные при помощи file_put_contents - читаются обычным HDD где-то в 4-5 раз медленней, чем записанные при помощи Far Manager. При этом в процессе их чтения головки трещат, что говорит о фрагментации файлов.

    Почему file_put_contents фрагментирует файлы, и можно ли как-то записывать файлы без фрагментации?

    OS: Win 8.1 с апдейтами, Win 7 без апдейтов
    PHP 7, запускается из консоли
    - но я думаю под другим ОС тоже будет фрагментация
     
    #1 mirosas, 26 авг 2018
    Последнее редактирование: 26 авг 2018
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Он не фрагментирует, а перезаписывает файл по дефолту. У данной функции есть флаги.
     
  3. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Это как перезаписывает файл по дефолу? Как бы изначально файла то не было.

    Я для теста из дириктории data скопировал файлы в пустую дирикторию data2 при помощи file_put_contents, и в пустую дирикторию data3 при помощи Far manager. Перегрузил ОС, и имею скорость чтения из data2 в 4-5 раз медленней чем из data3
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    ...не у всех ОС в их ФС есть понятие фрагментации файлов
    ... у FAR, насколько помню есть параметр - использовать системные функции при копировании (попробуйте с ним и без записать)
    + путаете понятия - создание файла, и копирование файла .... можете копировать средствами php (copy) и сравнить скорость (и звуки) ...с FAR
    Вообще все что происходит на уровне ФС - на это обычно приложения и ПО не влияют (в редких случаях) .... ну и какбэ все хе веб и php лучше себя чувствуют в nix
     
    #4 ADSoft, 26 авг 2018
    Последнее редактирование: 26 авг 2018
  5. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Ээ.. что такое FAF ?

    У меня самая обычная ntfs...

    Есть у меня нехорошее подозрение... что php просто пишет мелкими блоками постепенно увеличивая длину файла (из-за чего происходит фрагментация), вместо того, чтобы в случае с большими файлами сперва выделить место под файл, и только потом писать, а в случае с небольшими писать одним куском. Если оно так, то ФС не поддерживающая фрагментацию файлов (не знал что такие бывают) на записи просто захлебнется..
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ssd тебя спасёт
     
  7. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    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 у меня нету денежек..
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    как ты вообще до сих пор живёшь без ссд
    --- Добавлено ---
    нафига так много?
    сервак арендуй, если надо
    если разово - можно и подождать
    если часто - должно окупаться, иначе нафиг такую деятельность
     
    xaker01 нравится это.
  9. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Ну иногда подбешивает, что браузер открыватся 10 секунд потому как делает очень много обращений к диску, вместо 3-5, но делает он это 1 раз за день (потом все в кэше сидит). А так нормально.

    Я вот не понимаю людей, кто живут на SSD менее 500 гигов.

    Ну и денег на востановление данных с SSD у меня нету (40т.р. кажется), тогда как с HDD есть (10т.р.)
    --- Добавлено ---
    Ну я недавно чистил HDD, У меня 300 гигов занято на нем. 500 гигов самый минимум.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ты заведи 128 ссд под систему + проекты
    и 2ТБ хард под всякие киношки да лежалые файлы
     
  11. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    файлы созданные php copy такие же фрагментированные как и те, что созданы file_put_contents

    Я времени на таскание данных туда-сюда и вспоминание где киношки где что, потрачу больше, чем утром почистить зубы, пока superfetch запишет в оперативку большую часть нужных мне данных.

    С такой системой сжатия, 128гб под проекты мне не хватит, даже 512 может не хватить, если проект окажется большим..


    Я не нашел вменяемой системы резервных копирований (ну кроме может быть бекблейз, которая стоит 600 долларов за 10 лет, и которую я по этой причине еще не тестил), а ssd это, имхо, больший риск. Если сломалось устройство - то ценник на извлечение данных раз в 5 выше, а если вирь, то hdd заметить есть шансы пока тот шифрует, а ssd нет.

    SSD штука хорошая, но только объемом не менее 500 гигов (а лучше больше), и в сочетании ну хотя бы с бекблейз (600 долларов за ожидаемое время жизни накопителя).
     
    #11 mirosas, 26 авг 2018
    Последнее редактирование: 26 авг 2018
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Никогда не озадачивался такой темой, но наверное разница между результатом в Фар и ПХП в том, как они резервируют место. Попробуй в ПХП после создания файла сразу задать его конечный размер - Фар при копировании может так сделать.
     
  13. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Отличная идея, остается вопрос, как это сделать средствами php?
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
  15. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Может дело в кодировке, формате файла, наличии кириллицы.
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    это ты, брат, нудишь
    торренты качаются сразу на хард, проекты живут сразу на ссд, игрушки - как получится
     
  17. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Ну тот код проблему не решает... просто дописывает нули в начало файла.. но направление интересное.. может удастся что выкопать в нем... попробую...

    кодировка - вряд ли)))
    --- Добавлено ---
    Я все скачиваю на рабочий стол))) Ну и вообще, сейчас цены на SSD такие, что 512 стоит не многим дороже, чем 128 + HDD. Так что смысла особо нет...
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ну xyй знает
    upload_2018-8-26_22-42-41.png
    --- Добавлено ---
    на десктопе я б брал хард полюбому
     
  19. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    В общем после некоторой модификации все работает как надо. Спасибо за ссылочки.

    PHP:
    1. function file_put_contents_no_fragmentation($filename,$data)
    2. {
    3.    $fp=fopen($filename,'w');
    4.     fseek($fp, strlen($data)-1,SEEK_CUR);
    5.     fwrite($fp,'a');
    6.     fseek($fp, -strlen($data),SEEK_CUR);
    7.     fwrite($fp,$data);
    8.     fclose($fp);
    9. }
    - но я вот не знаю... двойная запись.. нормально или нет. hdd то фиолетово - он записать не успевает, а ssd может и успеть записать, а у него с перезаписью плохо)))
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ссд живёт долго, не парься
     
  21. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Тот коды выше, проблему решает лишь частично.

    Сперва происходит запись файла нужного размера (строка 5), а потом его перезапись (строка 7).

    На SSD уже протестировал, скорость записи от этого деяния падает в 2 раза (читаются с ssd такие файлы одинаково с теми, что просто пишутся file_put_contents, зато стираются быстрее). Теоретически это так же должно увеличивать нагрузку на сборку мусора (файлы стертые после file_put_contents создают ещё большую нагрузку на сборку мусора).

    Мм.. я думаю стоит признать, что это фундаментальная недоработка PHP, и способов её решения нет (так, чтобы перед записью в файл, был создан файл нужного размера в файловой системе, но при этом запись на поверхность на этом этапе не проводилась). И решаться скорее всего не будет, потому как на ssd file_put_contents фрагментирующий файлы не дает видимого негативного эффекта (хотя на серваке постоянно перезаписывающим данные фрагментация ssd ведет к существенному снижению средней (за сутки) скорости записи). С другой стороны разработчикам пхп внедрить этот функционал вряд ли бы стоило более 10-ка часов работы.
     
    #21 mirosas, 12 сен 2018
    Последнее редактирование: 12 сен 2018
  22. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Может проблема в синхронности PHP, можно например не записывать 100 файлов за один запуск PHP, а организовать 100 запусков с записью одного файла по счетчику до 100.
    А так PHP сам по себе ничего не пишет, а отправляет команды в систему через С++ на котором он написан.
     
  23. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Вы точно определили, что проблема именно в фрагментации(ntfs не так ей подвержена, как принято об этом думать)?
    попробуйте на раздел с ext fs писать, но если честно -- вряд-ли проблема с фрагментацией, можете ещё перед записью в файл формировать данные в ОЗУ и лишь по окончанию их сливать.
     
  24. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    я в винде сижу. А какие еще варианты есть? Что значит не так подвержена? Если сперва записать файл на 32кб, потом к нему добавить 32кб, потом еще 32кб, и т.д. то файл вполне может получиться фрагментированным.


    Это как вы себе средствами пхп представляете??
    --- Добавлено ---
    в первоначальном коде между записью файла и записью следующего проходило около полусекунды. ПХП неотличимо от сразу скидывает все на диск.

    который отправляет команды в операционную систему, которая отправляет команды конроллеру.
     
  25. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    драйвер поставьте...

    посмотрите хэксредактором физическое количество и расположение фрагментов

    эмм, тут вопрос, как Вы формируете файлы и какого они размера, суть в том, что, если грубо -- формируете большую строку (с переносами и т.д. и т.п.) , без кода и исходных данных тут сложно советовать, но самая простая ситуация, если Вы, например, пишите в файл по переносу строки, вместо того , чтобы сформировать одну переменную строкового типа с переносами и другими символами форматирования и запихнуть её в файл за одну операцию записи(там есть ограничение по длине, если не путаю, вот по нему и разбивать в цикле).