За последние 24 часа нас посетили 24640 программистов и 1786 роботов. Сейчас ищет 891 программист ...

Чем сжимать html-ки ?

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

  1. mirosas

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

    С нами с:
    17 июл 2015
    Сообщения:
    236
    Симпатии:
    5
    Нужно сотню на 90% схожих html файликов упаковать в 1 файлик. (и так гугол раз).

    Как делаю сейчас:

    PHP:
    1. <?php
    2. $htmls=Array();
    3. // кладу в массив 100 html-к
    4. foreach ($htmls as &$html)
    5. {
    6. $html=base64_encode(gzcompress($html,8)); //если base64_encode не делать, то json_encode иногда ругается почему-то.
    7. unset($html);
    8. }
    9. $to_hdd=json_encode($htmls);
    10. ?>
    Проблемы:
    1. base_64 - перерасход около 35%. можно уменьшить перерасход таким методом: сперва сделать bin2hex, потом json_encode, потом gzcompress - но скорость падает, и перерасход все равно около 15% есть.
    2. даже если все файлы будут одинаковые - в сжатом виде они занимают пропорционально числу файлов. Если алгоритм поменять так, чтобы сперва файлы склеивались в одну строку, а потом сжимались, то эффект сохраняется. Вместо gzcompress надо бы чего-то другое, что строку слеенную из 100 одинаковых строк ужимает не в 100 раз большую чем одну строку, а примерно в тот же размер, что одну строку..
     
    #1 mirosas, 25 авг 2018
    Последнее редактирование: 25 авг 2018
  2. mirosas

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

    С нами с:
    17 июл 2015
    Сообщения:
    236
    Симпатии:
    5
    Проблему 1 наверное можно решить либо заменой с экранированием каких-то символов (понять бы какие символы не хочет есть json-encode), либо использованием вместо json_encode склейки файлов через разделитель. Но это мелочь. Боле серьезна проблема 2.

    2. Теоретически если мы пакуем строку состоящую из подстрок на 90% схожих, то она должна паковаться дополнительно раз в 10, а этого не происходит.
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    зачем? Какую задачу это решает?
    Нужно танцевать от задачи. Озвучь задачу и подберём решение.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    1. Сжимайте просто в zip
    2. Сдается мне что и не нужно 100 и миллион раз все сжимать
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Используй serialize(). Она (а особенно unserialize) еще и быстрее намного.
    --- Добавлено ---
    и не надо будет никакого base64
     
  6. mirosas

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

    С нами с:
    17 июл 2015
    Сообщения:
    236
    Симпатии:
    5
    Задача. Php код получает миллион html-к (может и 10млн, рпзмер html-ки 200кб), которые нужно сохранить на hdd (в перспективе ssd), а потом каждую из html-к обработать другими php скриптами раз по 5-7.


    Где-то я видел, что serialize работает медленней json_encode, но сам пока не тестил.

    какой zip? Это функция php? Ну вот вчера я сжал 1.1 миллиона html-к и они заняли у меня 25 гигов в 5.5 тысячах файлов. Теперь эти файлы будут раз 5-10 распакованы (в оперативке), обработаны, после чего удалены.

    Как бы основная задача решена - уменьшение числа операций доступа к hdd, но для эстетической красоты хотелось бы еще и объем раз в 10 уменьшить (а в ближайшие полгола я 50% перейду на ssd, тогда еще объем будет актуальным и с практической стороны).
     
    #6 mirosas, 26 авг 2018
    Последнее редактирование: 26 авг 2018
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты столько усилий тратишь для экономии места? а смысл?
    а запаковка-распаковка происходят мгновенно и бесплатно? :D

    попробуй gz каждую отдельно для начала при рождении - с этим можно работать не распаковывая и с каждой страницей отдельно независимо от других страниц
     
  8. mirosas

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

    С нами с:
    17 июл 2015
    Сообщения:
    236
    Симпатии:
    5
    Усилия были потрачены на сокращение количества операций доступа (не знаю как у людей hdd выдают по 200 iops, у меня лишь 40iops на случайное чтение), ну и в какой-то момент я подумал что распаковка-упаковка все равно идет чуть быстрее линейных скоростей hdd, поэтому и ее добавил.

    А вчера вечером я задался вопросом, что это как-то неправильно что $html.$html пакуется в 2 раза больший объем чем просто $html. Ну и с эстетической стороны 35% перерасход от base64 смутил...

    Если будет 10-50млн файлов, и диск станет SSD, то вопрос места станет довольно остро.. Ну и иногда удобно было бы все эти операции запускать не на локальном компе, а на простенькой vds-ке.
     
    #8 mirosas, 26 авг 2018
    Последнее редактирование: 26 авг 2018
  9. mirosas

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

    С нами с:
    17 июл 2015
    Сообщения:
    236
    Симпатии:
    5
    Кстати... попробовал сжать обычным zip - эффект тот же. $html.$html сжимает в 2 раза больший размер чем просто сжатие $html

    А вот у Rar такой проблемы нет - $html.$html сжатый раром занимает столько же, сколько $html сжатый rarom

    Но rar это не свободное ПО, вряд ли php умеет в него сжимать.

    p.s. логика работы так-то не сложная, может есть что-то свободное, входящее в пхп, что может работать. Я бы ради интереса свою функцию сжатия написал, но подозреваю работать она будет сильно медленней библиотечных..
     
    #9 mirosas, 26 авг 2018
    Последнее редактирование: 26 авг 2018
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  11. mirosas

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

    С нами с:
    17 июл 2015
    Сообщения:
    236
    Симпатии:
    5
    gzcompress я и использую... но сжимать каждый файл отдельно затея не идеальная. В идеале хочется сжимать все файлы вкуче по алгоритму аналогичному непрерывного архива от винрар...
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    зато с каждой можно работать отдельно. хз че ты ебёшь себе мозг операциями с диском.

    хотя на мой взгляд
    если тебе сильно надо - купи/арендуй ssd
    если надо капец как сильно, то за сто баксов в месяц все твои файлы можно уместить в оперативке и ебать в 64 потока или даже больше.

    ты подумай, чего тебе надо-то.