Нужно сотню на 90% схожих html файликов упаковать в 1 файлик. (и так гугол раз). Как делаю сейчас: PHP: <?php $htmls=Array(); // кладу в массив 100 html-к foreach ($htmls as &$html) { $html=base64_encode(gzcompress($html,8)); //если base64_encode не делать, то json_encode иногда ругается почему-то. unset($html); } $to_hdd=json_encode($htmls); ?> Проблемы: 1. base_64 - перерасход около 35%. можно уменьшить перерасход таким методом: сперва сделать bin2hex, потом json_encode, потом gzcompress - но скорость падает, и перерасход все равно около 15% есть. 2. даже если все файлы будут одинаковые - в сжатом виде они занимают пропорционально числу файлов. Если алгоритм поменять так, чтобы сперва файлы склеивались в одну строку, а потом сжимались, то эффект сохраняется. Вместо gzcompress надо бы чего-то другое, что строку слеенную из 100 одинаковых строк ужимает не в 100 раз большую чем одну строку, а примерно в тот же размер, что одну строку..
Проблему 1 наверное можно решить либо заменой с экранированием каких-то символов (понять бы какие символы не хочет есть json-encode), либо использованием вместо json_encode склейки файлов через разделитель. Но это мелочь. Боле серьезна проблема 2. 2. Теоретически если мы пакуем строку состоящую из подстрок на 90% схожих, то она должна паковаться дополнительно раз в 10, а этого не происходит.
Используй serialize(). Она (а особенно unserialize) еще и быстрее намного. --- Добавлено --- и не надо будет никакого base64
Задача. 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, тогда еще объем будет актуальным и с практической стороны).
ты столько усилий тратишь для экономии места? а смысл? а запаковка-распаковка происходят мгновенно и бесплатно? попробуй gz каждую отдельно для начала при рождении - с этим можно работать не распаковывая и с каждой страницей отдельно независимо от других страниц
Усилия были потрачены на сокращение количества операций доступа (не знаю как у людей hdd выдают по 200 iops, у меня лишь 40iops на случайное чтение), ну и в какой-то момент я подумал что распаковка-упаковка все равно идет чуть быстрее линейных скоростей hdd, поэтому и ее добавил. А вчера вечером я задался вопросом, что это как-то неправильно что $html.$html пакуется в 2 раза больший объем чем просто $html. Ну и с эстетической стороны 35% перерасход от base64 смутил... Если будет 10-50млн файлов, и диск станет SSD, то вопрос места станет довольно остро.. Ну и иногда удобно было бы все эти операции запускать не на локальном компе, а на простенькой vds-ке.
Кстати... попробовал сжать обычным zip - эффект тот же. $html.$html сжимает в 2 раза больший размер чем просто сжатие $html А вот у Rar такой проблемы нет - $html.$html сжатый раром занимает столько же, сколько $html сжатый rarom Но rar это не свободное ПО, вряд ли php умеет в него сжимать. p.s. логика работы так-то не сложная, может есть что-то свободное, входящее в пхп, что может работать. Я бы ради интереса свою функцию сжатия написал, но подозреваю работать она будет сильно медленней библиотечных..
ssd + gz каждую отдельно --- Добавлено --- https://php.ru/manual/function.gzcompress.html https://php.ru/manual/function.gzopen.html
gzcompress я и использую... но сжимать каждый файл отдельно затея не идеальная. В идеале хочется сжимать все файлы вкуче по алгоритму аналогичному непрерывного архива от винрар...
зато с каждой можно работать отдельно. хз че ты ебёшь себе мозг операциями с диском. хотя на мой взгляд если тебе сильно надо - купи/арендуй ssd если надо капец как сильно, то за сто баксов в месяц все твои файлы можно уместить в оперативке и ебать в 64 потока или даже больше. ты подумай, чего тебе надо-то.