我的目标是使用C/C++将32位位图(BGRA)缓冲区实时转换为png图像.为了实现它,我使用libpng库转换位图缓冲区,然后写入png文件.然而,在单线程中执行目标臂板(四核处理器)似乎需要花费大量时间(~5秒).在分析时,我发现libpng压缩过程(deflate算法)占用了90%以上的时间.所以我试图通过某种方式使用并行化来减少它.这里的最终目标是至少在不到0.5秒的时间内完成.
现在因为png可以有多个IDAT块,我想到并行编写多个IDAT的png.使用以下方法编写具有多个IDAT的自定义png文件
1. Write PNG IHDR chunk
2. Write IDAT chunks in parallel
i. Split input buffer in 4 parts.
ii. compress each part in parallel using zlib "compress" function.
iii. compute CRC of chunk { "IDAT"+zlib compressed data }.
iv. create IDAT chunk i.e. { "IDAT"+zlib compressed data+ CRC}.
v. Write length of IDAT chunk created.
vi. Write complete chunk in sequence.
3. write IEND chunk
Run Code Online (Sandbox Code Playgroud)
现在问题是此方法创建的png文件无效或已损坏.有人可以指出
注意:创建块时遵循PNG规范
更新:此方法适用于并行创建IDAT
1. add one filter byte before …Run Code Online (Sandbox Code Playgroud) 我见过关于 zlib 压缩的最小和最大大小的线程。我想知道人们认为可确保最佳速度的压缩数据块的最佳大小是多少。将文件分割成多个文件块是否有优势?
谢谢。
全部,
我只是想使用 dev-c++ 让 zpipe 演示工作,其中我导入了所有 zlib 代码并使用 zpipe.c 作为示例。一切都编译并运行。如果我尝试使用注释掉的 deflateInit2 调用创建 gzip 文件,它会创建现在错误,但在使用 7zip 解压缩时会损坏。如果我使用标准 zlib 标头来创建文件,当我使用相应的调用来 inflate 时,它会返回 -3/Z_DATA_ERROR ,表明我的默认数据已损坏。一切都表明定义中有问题,但它几乎就是这个例子。
有任何想法吗??非常感谢!
int main(int argc, char **argv)
{
int ret;
FILE *source;
FILE *zip;
FILE *zipped;
FILE *back;
source = fopen ("C:\\Users\\schmoudm\\Pictures\\caela.jpg", "r");
zip = fopen ("C:\\Core\\RD\\test.gz", "w");
printf ("calling def \n");
ret = def(source, zip, Z_DEFAULT_COMPRESSION);
printf("def return: %i \n", ret);
fclose(source);
fclose(zip);
if (ret == 0) {
printf ("setting up inf \n");
zipped = fopen ("C:\\Core\\RD\\test.gz", "r"); …Run Code Online (Sandbox Code Playgroud) 我有机会预设字典以进行 deflate 压缩。这对我来说是有意义的,因为要压缩的数据相对较小,为 1kb-3kb,而且我有大量代表性示例。要压缩的数据由任意字节序列组成,因此标记化等不是一个好方法。此外,数据显示大量重复(数据示例之间),因此好的字典可能会给出非常好的结果。问题是如何算出好的字典呢?是否有一种算法可以计算最佳字典(给定样本数据)?
我开始研究前缀树,但不清楚如何在这种情况下使用它们。
最好的问候,贾里克
我有一个带Debian 7.1的虚拟Linux盒子,我需要一个Python 2.4.6来恢复旧的Zope安装(当然,为了将它更新为Plone 4).
我当然需要ssl支持,当我正在编译时,我readline当然也想要.最后,当然我需要zlib,否则ez_setup.py等等都行不通; 我很难被zlib包括在内.
我下载的Python 2.4.6的压缩包,启用ssl在Modules/Setup.dist:
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
Run Code Online (Sandbox Code Playgroud)
......并呼吁:
./configure --prefix=/my/dest/dir --with-zlib
make
Run Code Online (Sandbox Code Playgroud)
make给我一些警告大约在年底crypt和nis,但make install不会产生任何错误.但是,由此产生的Python既支持readline又ssl支持,但没有zlib; 因此,我无法使用ez_setup.pysetuptools/pip等.
我试图取消注释并重新排除该行
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
Run Code Online (Sandbox Code Playgroud)
来自Setup.dist.
安装的一些系统包:
zlib1g-devlib32z1-devlibreadline-gplv2-dev还有什么我错过的吗?
更新后,继续阅读/sf/answers/283330841/:
我做到了
$ sudo apt-get install zlib1g …Run Code Online (Sandbox Code Playgroud) 我一直在 mongodb 中使用 WiredTiger 存储引擎的默认(snappy)压缩,并且我想切换到 zlib。但是,我的应用程序中已经有一些用户处于活动状态,并且数据库中有数据,我想确保以最小的中断进行此更改。默认情况似乎是简单地重新创建数据库,例如通过 mongodump 转储并使用 zlib 压缩选项恢复到新数据库,然后指向新数据库。如果我在没有用户处于活动状态时进行切换,那么这很可能会很好地完成任务,但我想知道是否有更好的方法来进行更改,例如实现与现有数据库?
如果它是有用的上下文,则对更好压缩的需求实际上只涉及部分数据。如果有一种方法可以仅为数据库中的某些文档切换到 zlib 压缩,那就太好了。另外,为了以防万一,我正在使用 perl MongoDB.pm。
PS 这是我第一次查询 stackoverflow。我已经寻找答案并尝试遵循适当的提问惯例,但如果我以错误的方式处理问题,请温和地教育我。:)
我正在尝试在 Python 2.7 中解压缩 byte64 编码的字符串。
我可以通过在命令行中运行以下命令来验证我的字符串是否有效:
echo -n "MY_BASE64_ENCODED_STRING" | base64 -d | zcat
Run Code Online (Sandbox Code Playgroud)
但是,如果我在 Python2.7 中运行它:
b64_data = 'MY_BASE64_ENCODED_STRING'
text_data = zlib.decompress(base64.b64decode(b64_data))
Run Code Online (Sandbox Code Playgroud)
我得到一个例外:
解压缩数据时出现错误-3:标头检查不正确
我应该向 zlib.decompress 传递额外的参数以使其工作吗?
在 MongoDB 中,WiredTiger 提供了 Zlib 压缩选项。
为了启用 Zlib 压缩选项,我使用以下代码创建了一个集合。
db.createCollection( "questions", { storageEngine: {
wiredTiger: { configString: "blockCompressor=zlib" }}})
Run Code Online (Sandbox Code Playgroud)
我运行了一些简单的测试来测量压缩性能并使用以下数据集存储字符串
{
'_id': <ObjectID>,
'question_id': <Five character string>,
'question': <My question>
}
Run Code Online (Sandbox Code Playgroud)
我使用以下代码创建了具有任何压缩选项的另一个集合。
db.createCollection( "questions")
Run Code Online (Sandbox Code Playgroud)
使用以下注释测量数据大小
db.stats(1024*1024).dataSize + db.stats(1024*1024).indexSize
Run Code Online (Sandbox Code Playgroud)
但我无法看到这两个集合之间的压缩差异。我参考了以下链接来实现我的流程。
https://www.mongodb.com/blog/post/new-compression-options-mongodb-30
https://scalegrid.io/blog/enabling-data-compression-in-mongodb-3-0/
我正在尝试确定 OpenJDK 是否受到CVE-2022-37434的影响。
我检查了 OpenJDK源代码,看起来它只使用了 zlib 中的以下方法:
zlib中包含漏洞的方法是inflateGetHeader,因此看起来OpenJDK不受此影响。有人可以确认我的推理是否正确吗?
.gz我有一个在类似文件的对象中查找的应用程序。
Pythongzip.GzipFile支持这一点,但是效率很低 \xe2\x80\x93 当 GzipFile 对象被要求向后查找时,它将倒回到流的开头 ( seek(0)),然后读取所有内容并将其解压缩到所需的偏移量。
不用说,当寻找一个大的数据时,这绝对会降低性能。tar.gz文件(数十 GB)时,这绝对会降低性能。
因此,我希望实现检查点:时不时地存储流状态,当要求向后查找时,仅转到下一个先前存储的检查点,而不是一直倒回到开头。
\n我的问题是围绕gzip/zlib实现:“当前解压缩器状态”由什么组成?它存储在哪里?它有多大?
如何从打开的 GzipFile 对象中复制该状态,然后将其分配回“向后跳转”搜索?
\n注意我无法控制输入 .gz 文件。解决方案必须严格针对只读rb模式的GzipFile。
编辑:查看 CPython 的源代码,这是相关的代码流和数据结构。从顶层 (Python) 到原始 C 排序:
\ngzip._GzipReader.seek() == DecompressReader.seek() <=== 需要更改此设置
\nZlibDecompressor 状态+其深层复制 <=== 需要复制/恢复此内容
\nEDIT2:还在以下位置找到了这个预告片zlib: …