- 1
- 2
- 3
- 4
- 5
GZIPOutputStream out = new GZIPOutputStream(out) {
{
def.setLevel(Deflater.BEST_COMPRESSION);
}
};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+73
GZIPOutputStream out = new GZIPOutputStream(out) {
{
def.setLevel(Deflater.BEST_COMPRESSION);
}
};
Вот так можно выставить максимальную степень сжатия GZIP-потока в жабе.
если тебя не смущает такое время работы, то лучше поковырять bzip2 или lzma.
...what?
мне казалось что в дебиане уже все тулзы для этого есть - просто нужно специально подготовленый каталог какой-то тулзе скормить, и она из него сделает деб?
> Ворнинги я не люблю, а время сжатия килобайтной странички значения не имеет.
в дебах все жмется с самой высокой компрессией. потому что жмется только раз, а распаковывается много раз.
не вижу никаких вариантов - http://www.debian.org/doc/debian-policy/ch-docs.html - и ZGIPOutputStream стандартный класс, что гарантирует что ничего лучше ты не найдешь (апачев точно так же туп).
другими словами: пытаться запустить внешний gzip/gzip.exe на маны, если оный отсутствует, то жать штатным стримом и терпеть варнинги линтиана.
я maven пытаюсь прикрутить, в деб-пакеты хочу включать зависимые библиотеки. А о зависимостях лучше всех maven-у и известно, почему бы им и не собирать? К тому же, работает на порядок быстрее, чем сонм перловых тулов, проверено.
не DD, но вот что нагуглил случайно:
http://lintian.debian.org/manual/section-2.4.html
не решение, но может воркараунд.
http://www.debian.org/doc/debian-policy/ch-docs.html
стоит "should" а не "must". линтиан будет жаловатся работа у него такая. но вроде бы не -9 компрессия не противоречит полиси.
Для HTTP они не годятся, как и для огромного количества других вещей где юзается zlib.
Прям так и не нужно. Это только по мнению дебилов ничего более современного не нужно.
А гугл вон изобретает новые алгоритмы для http сжатия.
И с других мест тоже звучат предложения: жать не только тело, но и заголовки.
SDCH использует дельта-кодирование (идее которого не менее 20 лет) VCDIFF.
Повторяю еще раз - проблема в стандартизации, внедрении и патентах.
Оказывается, сжимать данные в снэпи при записи на диск, и читать их, распаковывая на лету, в среднем раза в полтора быстрее, чем читать/писать непожатые данные.
интересно, кстати
а можно прикрутить вообще на уровне файловой системы? заявлено 500МБ/с декомпресс, а это в принципе, на уровне современного ссд без рейда
Ну если запретить открытие файла на read+write и смириться с тормозами seek - скорее всего можно. Чтение целиком и запись целиком будут шустрыми.
И все тестят скорость на throughput, а не на latency. Сраные SSD и райд контроллеры с батарейками развратили людей ;(
Тем временем в линухах до сих пор живет знаменитый баг 12309 - когда все процессы, требующие i/o (в особенности записи) встают колом секунд на 5-10, во время копирования больших файлов...
Это только на флешках вроде? А вообще даже на винде эта проблема есть. Особенно хорошо видна когда торрентов упорото много назапустил. Поднимай приоритет процессу не поднимай, а толку ноль. На ио приоритет не как не влияет и высокоприоритетные задачи будут стоять на ио подгрузки страниц памяти или других данных- просто колом.
Да хер там. Когда копируешь что-нибудь в районе 20 гиг на HDD или создаешь файлик подобного размера, возникает такое ощущение, что это не 4 ядерная зверюга с 16 гигами памяти, а сраное говнище из 90х годов ;( Типичный лаг в пределах 0.25-0.75с со всплесками до 5-10.
Вот с торрентами, кстати, проблем не замечал. У меня траблы начинаются вроде как именно при непрерывных потоках в районе 100+ мегабайт в секунду.
Планировщики пробовал потюнить, ну снижается лаг, но все равно терпеть невозможно. В винде такого не замечал :(
А Тарас то со своим силироном 600 мгц не знал!
А ещё говорили, что не гугл сейчас является движущей силой прогресса и придумывает алгоритмы.
Хотя всё зависит от алгоритма сжатия.
Что-то я не понимаю, в чем жабофейспалм... compression method харкодится потому, что в rfc на gzip описан только deflate: (http://www.gzip.org/zlib/rfc-gzip.html), другие методы GZIPOutputStream не поддерживает, да и их, вроде бы, никто еще и не придумал... Поэтому с хардкодом deflate'а, имхо, все нормально.
И в заголовках gzip'а и deflate'а никуда не пишется степень сжатия. Видимо lintian тупо пытается распаковать и переупаковать файл на -9, и если у него получилось меньше, то матерится?
XFL (eXtra FLags)
These flags are available for use by specific compression methods. The "deflate" method (CM = 8) sets these flags as follows:
XFL = 2 - compressor used maximum compression, slowest algorithm
XFL = 4 - compressor used fastest algorithm
Собственно их GZIPOutputStream и хардкодит в нолик. Как вариант - можно скопировать исходник GZIPOutputStream'а себе в проект и добавить кошерную поддержку уровней. Жаль что в апстрим эту пару строчек всяко не пропихнуть ;(
P.S. Если бы writeHeader не был приватным - пофиксить было бы легко ;(
На похожую парашу наткнулся, когда мутил какой-то binaryoutputstream, там нельзя было что-то перезаписать.
У меня страничка пишется в in-memory, я решил постфактум флажок в массиве байт подхачить.
Хм, а почему? Ну не только ради этого хака же?
Можно упаковать два раза - первый раз в стрим, который только считает байты, второй раз - куда надо.
Короче говоря, не во всех реализациях можно возвращать в поток более 1 символа.
Не пойму что не нравится Роману.
>хардкодит compression method в заголовке
Есть DeflaterOutputStream, который ничего не пишет в заголовок и имеет подходящий конструктор:
public DeflaterOutputStream(OutputStream out, Deflater def)