169 похожих чатов

Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо

сжимающий) алгоритм
А ещё лучше в pure pascal
А ещё лучше одним *.pas файлом
?

52 ответов

55 просмотров

так слёту только paszlib если прикручивать

notme- Автор вопроса
Alexey Kulakov
так слёту только paszlib если прикручивать

ZLib который(-ая?) в TCompressionStream И Deflate, который как правило в ZIP Это одно и тоже или нет?

notme- Автор вопроса
Alexey Kulakov
так слёту только paszlib если прикручивать

Ага, судя по информации в интернете - что Zip(как правило с алго deflate), что ZLib - это одно и тоже

Зачем тебе такое старье? Штатного zlib за глаза. В дельфе юзается сишный обьектник, в лазаре там да, там тормозная реализация- поэтому у себя в fwzip для лазаря тож обьектники сгенерил

notme- Автор вопроса
notme- Автор вопроса
Александр (Rouse_) Багель
Зачем тебе такое старье? Штатного zlib за глаза. В...

LZ4 - вроде как не сильно в степени компрессии проигрывает, зато выигрывает по времени значительно Zstd - не старьё По скорости - по сравнению с лазаревской реализацией vs твоя

Есть LZW на чистом паскале. Прикрути его к Stream, он уже там есть.

Boris Usievich
А смысл в "чистом" паскале?

бывает что есть смысл, когда нужно что-то править. мы правили для себя

T7zStream из https://github.com/geoffsmith82/d7zip

Михаил Усков
T7zStream из https://github.com/geoffsmith82/d7zip

Иии, вопрос кторый я задавал как то Розычу, по его FWZip - А он сам жмёт?

Евгений
Иии, вопрос кторый я задавал как то Розычу, по его...

черным по зеленому написано "wrapper around 7z.dll"

notme- Автор вопроса
Евгений
Иии, вопрос кторый я задавал как то Розычу, по его...

нет, там же объектники, как он ответил чуть выше

Евгений
Иии, вопрос кторый я задавал как то Розычу, по его...

FWZip это реализация ZIP контейнера, чем жать - ему пофиг. Конкретно щас он жмет zlib-ом, но легко можно подключить любую другую реализацию

Если для сжатия передаваемых данных, то достаточно обычного deflate из zip. Он быстрый и потоковый. А если надо максимум компрессии и времени не жалко, то тут надо к разным видам данных разный подход применять. Для текстов, звуков и картинок есть свои лучшие алгоритмы. Или жать все LZMA из 7zip, он очень долгий, но универсальный.

notme- Автор вопроса
Sergey Bodrov
Если для сжатия передаваемых данных, то достаточно...

для сжатия и быстро TCompressionStream из FPC/Lazarus не так уж и быстр на хорошо сжимаемых данных - он быстр, на плохосжимаемых 350мегов жмёт 9сек плохосжимаемые: for i:=0 to size-1 do if random(5)=0 then buf[i]:=random(255);

notme
для сжатия и быстро TCompressionStream из FPC/Laza...

Там вроде есть уровни компрессии, можно с ними поэкспериментировать. Вроде первый уровень быстрее копировния, но при этом даже жмет

notme- Автор вопроса
notme
для сжатия и быстро TCompressionStream из FPC/Laza...

а дельфевый сколько жмет по времени?

notme
для сжатия и быстро TCompressionStream из FPC/Laza...

Один из самых быстрых - google snappy, но нативной реализации под Паскаль нету. Есть только распаковка, причем которую пилил я давным давно. И есть биндинги к либе, ещё в сети можно нагуглить вариант с смешными объектниками для дельфей, но это старый сишный порт оригинала

notme- Автор вопроса
Александр (Rouse_) Багель
а дельфевый сколько жмет по времени?

#Lazarus #FPC -O4 TCompressionStream (size = 350.00Mb, random_k = 1) time:12.20, Size: 350.11 Mb TCompressionStream (size = 350.00Mb, random_k = 2) time:13.43, Size: 255.88 Mb TCompressionStream (size = 350.00Mb, random_k = 3) time:11.45, Size: 200.83 Mb TCompressionStream (size = 350.00Mb, random_k = 4) time:10.00, Size: 167.88 Mb TCompressionStream (size = 350.00Mb, random_k = 8) time:6.60, Size: 106.68 Mb TCompressionStream (size = 350.00Mb, random_k = 16) time:4.25, Size: 65.28 Mb TCompressionStream (size = 350.00Mb, random_k = 32) time:2.83, Size: 38.45 Mb TCompressionStream (size = 350.00Mb, random_k = 64) time:2.05, Size: 22.10 Mb TCompressionStream (size = 350.00Mb, random_k = 128) time:1.68, Size: 12.69 Mb TCompressionStream (size = 350.00Mb, random_k = 256) time:1.50, Size: 7.50 Mb #Delphi 11 CE x64 Release TCompressionStream (size = 350.00Mb, random_k = 1) time:8.49, Size: 350.11 Mb TCompressionStream (size = 350.00Mb, random_k = 2) time:9.20, Size: 255.90 Mb TCompressionStream (size = 350.00Mb, random_k = 3) time:7.71, Size: 200.84 Mb TCompressionStream (size = 350.00Mb, random_k = 4) time:6.59, Size: 167.90 Mb TCompressionStream (size = 350.00Mb, random_k = 8) time:4.31, Size: 106.68 Mb TCompressionStream (size = 350.00Mb, random_k = 16) time:2.70, Size: 65.28 Mb TCompressionStream (size = 350.00Mb, random_k = 32) time:1.76, Size: 38.46 Mb TCompressionStream (size = 350.00Mb, random_k = 64) time:1.23, Size: 22.08 Mb TCompressionStream (size = 350.00Mb, random_k = 128) time:0.97, Size: 12.69 Mb TCompressionStream (size = 350.00Mb, random_k = 256) time:0.85, Size: 7.50 Mb program Project1; {$mode objfpc}{$h+} // FPC {$APPTYPE CONSOLE} // Delphi uses SysUtils,classes ,System.ZLib // Delphi //,zstream // FPC ; const size = 1024*1024*350; procedure TestTCompressionStream(size, random_koef: integer); var i:integer; mem_source: pbyte; ms,cs:tstream; t:Double; begin getmem(mem_source, size); FillChar(mem_source^, size, 0); for i:=size-1 downto 0 do if random(random_koef)=0 then mem_source[i]:=Random(255); ms := TMemoryStream.Create; cs := TCompressionStream.Create(clfastest, ms); t:=Now; cs.Write(mem_source^, size); cs.Free; WriteLn('TCompressionStream (size = ', size/1024/1024:0:2,'Mb', ', random_k = ',random_koef, ') time:',(Now-t)*SecsPerDay:0:2, ', Size: ',ms.Size/1024/1024:0:2,' Mb' ); ms.Free; Freemem(mem_source); end; begin TestTCompressionStream(size, 1); TestTCompressionStream(size, 2); TestTCompressionStream(size, 3); TestTCompressionStream(size, 4); TestTCompressionStream(size, 8); TestTCompressionStream(size, 16); TestTCompressionStream(size, 32); TestTCompressionStream(size, 64); TestTCompressionStream(size, 128); TestTCompressionStream(size, 256); WriteLn('Done...'); ReadLn; end.

notme
#Lazarus #FPC -O4 TCompressionStream (size = 350.0...

ну возьми вот этот стрим и проверь https://github.com/AlexanderBagel/FWZip/blob/master/FWZipZLib.pas

notme- Автор вопроса
Александр (Rouse_) Багель
ну возьми вот этот стрим и проверь https://github....

там объектники у тебя, я хотел на pure pascal Да ладно уже, пуст как будет - так и будет

notme
там объектники у тебя, я хотел на pure pascal Да л...

т.е. обьектники в дельфи тебя не смущают? :)))))))

notme- Автор вопроса
Александр (Rouse_) Багель
т.е. обьектники в дельфи тебя не смущают? :)))))))

неа ) они без делфи не существуют отдельно, есть делфи - есть объектники я люблю когда либо из коробки, либо файлов мало, внешних зависимостей

notme- Автор вопроса
notme
Макаронный монстр

Я тебе просто по своему опыту скажу что коробочное что в дельфе что в лазаре мало что юзабельно на дистанции, соответственно именно поэтому я почти на все аналоги написал которые работают правильно

notme- Автор вопроса
notme
#Lazarus #FPC -O4 TCompressionStream (size = 350.0...

Вот это я понимаю! TZstdAlgoCompression (size = 350.00Mb, random_k = 1) time:0.16, Size: 350.01 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 2) time:1.08, Size: 224.57 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 3) time:1.27, Size: 176.09 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 4) time:1.34, Size: 148.10 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 8) time:1.27, Size: 93.22 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 16) time:1.00, Size: 54.52 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 32) time:0.65, Size: 30.34 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 64) time:0.39, Size: 16.51 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 128) time:0.24, Size: 8.90 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 256) time:0.16, Size: 4.82 Mb

notme- Автор вопроса
notme- Автор вопроса
Alexey Kulakov
на туфту похоже

ну и живи с zipper.pp или как там его ) а я буду с Zstd Ещё и жмёт лучше! И это на самом минимальном уровне компрессии

notme
ну и живи с zipper.pp или как там его ) а я буду с...

зиппер из коробки, хоть он мне и не нравится. и трахаться с объектниками Сишными я не люблю. и длл дополнительную не хочется

notme- Автор вопроса
Alexey Kulakov
зиппер из коробки, хоть он мне и не нравится. и тр...

ну я по началу тоже так хотел но на одном из случаев я сдался, не хочу ждать, если можно небольшим усилием всё ускорить в 10 раз

notme
ну я по началу тоже так хотел но на одном из случа...

распаковывает теперь ок, упаковка мне, к счастью, некритична. Значит, могу пользоваться

notme- Автор вопроса
Alexey Kulakov
на туфту похоже

Ну вот к примеру на уровне компрессии = 9 (предыдущий результат был при уровне = 1 (минимальный)) TZstdAlgoCompression (size = 350.00Mb, random_k = 1) time:0.43, Size: 350.01 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 2) time:11.35, Size: 242.81 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 3) time:12.89, Size: 184.74 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 4) time:12.80, Size: 149.63 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 8) time:10.05, Size: 87.46 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 16) time:6.77, Size: 49.91 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 32) time:4.32, Size: 27.89 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 64) time:2.82, Size: 15.17 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 128) time:1.88, Size: 7.96 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 256) time:1.18, Size: 4.08 Mb Похоже на правду? Что интересно выйгрыша по компрессии особого нету, зато по времени просадка значительная

notme- Автор вопроса

А по каким признакам ты определяешь?

notme
Ну вот к примеру на уровне компрессии = 9 (предыду...

ну архиватор ты написал - теперь пиши разархиватор

notme
Ну вот к примеру на уровне компрессии = 9 (предыду...

Compression speed can vary by a factor of 20 or more between the fastest and slowest levels, while decompression is uniformly fast, varying by less than 20% between the fastest and slowest levels.

notme- Автор вопроса
Serg
Compression speed can vary by a factor of 20 or mo...

Заполнение Random'ом занимает больше времени, чем упаковка 😄 кратно

notme- Автор вопроса
notme
ну я по началу тоже так хотел но на одном из случа...

@Awkward_im В общем дело-то возможно даже было не в TCompressionStream 😁 А в том, что я VTV заполняю нодами поштучно - это вызывает каждый раз перевыделение памяти А нод у меня о-ё-ёй! ) Так-что тут ты прав ) Надо или сохранять количество детей в ноде и выделять память разом, или + перейти на ленивую загрузку (но это сложнее)

notme
@Awkward_im В общем дело-то возможно даже было не...

Ваще vtv заточена на такое, там даже тест есть на скорость создания ляма узлов (только зачем такое в гуе, лям узлов???)

notme- Автор вопроса
Александр (Rouse_) Багель
Ваще vtv заточена на такое, там даже тест есть на ...

в профайлере - дерево у меня, они есть, но отображаются-то не все юзвер ходит и смотрит где больше кол-во выделений или объём

notme- Автор вопроса
Александр (Rouse_) Багель
Ваще vtv заточена на такое, там даже тест есть на ...

Да уж, было не просто... пришлось делать самолепный индекс нод для возможности нормального ленивого чтения дерева

notme
Да уж, было не просто... пришлось делать самолепны...

Неймспейсы рулят, у меня ленивое через низ сделано

notme- Автор вопроса
Александр (Rouse_) Багель
Неймспейсы рулят, у меня ленивое через низ сделано

никогда раньше такого не делал ) думал да чего там какое-то дерево сериализовать и потом читать в ленивом режиме, оказалось не всё так просто как на первый взгляд 😄 А неймспейсы - это как? ключевые слова для гугления

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта