问题标签 [bzip2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - 最快的 bzip2 解压器是什么?
bzip2的哪个实现解压速度最快?
有一个http://bitbucket.org/james_taylor/seek-bzip2/src/tip/micro-bunzip.c声称
Manuel Novoa III (mjn3@codepoet.org) 的大小和速度优化。更有效地读取霍夫曼代码、简化的 read_bunzip() 函数以及各种其他调整。在(有限的)测试中,在 x86 上比 bzcat 快约 20%,在 arm 上快约 10%。请注意,大约 2/3 的时间用于 read_unzip() 反转 Burrows-Wheeler 转换。大部分时间是由于缓存未命中导致的延迟。
许多缓存未命中有机会通过某些技术进行优化,因此更快的实现是可能的。
这个(seek-bzip2)还有一个有趣的功能,即在输入文件中轻松搜索。
我的程序将消耗 bzip2 的输出,并且(理论上)可以在文件的不同部分并行执行此操作。因此,也考虑了并行 bzip2 实现。
谢谢。
optimization - 用于 x86 和 +1 移位的快速 memmove(用于移动到前端变换)
对于快速 MTF(http://en.wikipedia.org/wiki/Move-to-front_transform),我需要更快的版本将 char 从数组内部移动到它的前面:
cachegrind 显示,对于 memmove,这里有很多分支错误预测。
对于其他版本的代码(不是第一个示例中的 memmove,而是这个)
有很多字节读取/写入、条件分支和分支错误预测
i 不是很大,因为它是用于“良好”输入的 MTF - BWT 之后的文本文件(Burrows–Wheeler 变换)
编译器是 GCC。
mercurial - Mercurial Web Server - 为什么我下载的是 .bz2.tar 文件而不是 .tar.bz2 文件?
我的理解是 .tar 文件包含目录和其他文件,而 .bz2 是使用 bzip2 压缩压缩的文件。
因此,大多数使用 bzip2 压缩的 tarball 都以:
这是应用于 tarball 的 bzip2 压缩。
但是,每当我从 Mercurial 网络服务器下载源代码时,您可以从内部获取源代码:
或者从 BitBucket,我得到一些以
这对我来说没有意义,因为你不能对多个文件应用 bzip2 压缩,这就是为什么你需要先“tar”它们。
这是 Mercurial 中的错误吗?或者这是我的网络浏览器中的一个错误(我在 Windows 中尝试过 Google Chrome,在 Ubuntu 中尝试过 Firefox)?还是这很奇怪但没有什么不同?
我下载的最新资源来自http://bitbucket.org/bos/hgbook,它是 Mercurial 书的存储库。
python - 压缩编解码器如何在 Python 中工作?
我正在查询数据库并使用 Python 归档结果,并且在将数据写入日志文件时尝试压缩数据。不过,我遇到了一些问题。
我的代码如下所示:
但是,我的输出文件的大小为 1,409,780。bunzip2
在该文件上运行会产生一个大小为 943,634 的文件,在该文件上运行bzip2
会产生一个大小为 217,275 的文件。换句话说,未压缩的文件比使用 Python 的 bzip 编解码器压缩的文件要小得多。 除了在命令行上运行之外,有没有办法解决这个问题?bzip2
我尝试了 Python 的 gzip 编解码器(将行更改为codecs.open(archive_file, 'a+', 'zip')
),看看它是否解决了问题。我仍然得到大文件,但是gzip: archive_file: not in gzip format
当我尝试解压缩文件时也出现错误。 那里发生了什么事?
编辑:我最初以附加模式打开文件,而不是写入模式。虽然这可能是也可能不是问题,但如果文件以“w”模式打开,问题仍然存在。
c - 如何使用 C 从 bzip2 存档中提取所有数据?
我有一个由一些bzip2
档案组成的串联文件。我也知道该文件中各个bzip2
块的大小。
我想bzip2
从单个 bzip2 数据块中解压缩流,并将输出写入标准输出。
首先,我使用fseek
将文件光标移动到所需的存档字节,然后将文件的“大小”块读取到BZ2_bzRead
调用中:
问题是,当我将fprintf
语句的输出与bzip2
在命令行上运行的输出进行比较时,我得到了两个不同的答案。
bzip2
具体来说,与在命令行上运行相比,我从这段代码中获得的输出更少。
更具体地说,此代码的输出是命令行进程输出的较小子集,并且我缺少感兴趣的 bzip2 块尾部的内容。
我已经通过另一种技术验证了命令行bzip2
提供了正确的答案,因此,我的 C 代码的一些问题导致块末尾的输出丢失。我只是不知道那个问题是什么。
如果您熟悉bzip2
or libbzip2
,您能否就我在上面的代码示例中做错了什么提供任何建议?感谢您的意见。
c - 如何处理基于 C 的应用程序内部的数据流?
我正在从bzip2
C 应用程序中的流中提取数据。随着数据块从解压缩器中出来,它们可以被写入stdout
:
这很好用。当它被发送到时,我得到了所有的数据stdout
。
我不想写信给stdout
,而是想在内部以单行块处理此语句的输出:一个以换行符结尾的字符串\n
。
我是否将解压缩器流的输出写入另一个缓冲区,一次一个字符,直到遇到换行符,然后调用每行处理函数?这很慢吗?有更聪明的方法吗?谢谢你的建议。
编辑
感谢您的建议。每次我通过输出缓冲区的数据时,我最终创建了一对缓冲区,将剩余部分(输出缓冲区末尾的“存根”)存储在短行缓冲区的开头。
我逐个字符地循环输出缓冲区并一次处理换行符的数据。无换行符的剩余部分被分配和分配,并复制到下一个流的行缓冲区。似乎realloc
比重复malloc-free
声明更便宜。
这是我想出的代码:
我真的很感谢大家的帮助。这工作得很好。
php - PHP:我不认为我可以重新编译 PHP,我应该怎么做才能使用 bzip2 库?
我在共享主机上,我注意到 PHP 不包含 bzip2。看来我必须重新编译 PHP 才能使用它。我认为共享主机不允许这样做,那么我的情况或 bzip2 有什么替代方案吗?
java - Java:Bzip2 库
我需要创建 Bzip2 存档。从“Apache ant”下载的 bzip2 库。
(我没有找到任何如何使用它的示例,所以我决定以这种方式使用它)
但它会在磁盘上创建一个损坏的存档。
c - 帮助在 Windows 上编译 seek-bzip2
我无法在 Windows 下编译 James Taylor 出色的小“seek-bzip2”?它可以索引 bzip2 存档,然后使用该索引提供对存档各个块的随机访问。
它是用 C 编写的,需要 64 位长的 long,可在此处获得:http: //bitbucket.org/james_taylor/seek-bzip2
我无法让它在任何免费的 Windows C 编译器上编译。
- Borland 没有一些必需的头文件。
- lcc 编译它,但它在任何 bzip2 文件上都因“意外 EOF”而失败。
- 如果您删除“-m64”标志,mingw 将编译它,但它会以与上述 lcc 相同的方式失败。
免费的编译器似乎没有很好的调试支持,MS Visual Studio 拒绝安装在我的可移动硬盘上,而且我的上网本的 C 和 D 驱动器没有足够的空间。
编辑自从我要求某人为我移植它以来,我已经改写了这个问题,但我很高兴自己尝试移植它。我只是不知道从哪里开始。自从 64 位类型变得普遍之前,我就没有接触过 C。
python - 在 Python 中计算/验证 bz2 (bzip2) CRC32
我正在尝试计算/验证压缩 bzip2 档案的 CRC32 校验和。
http://en.wikipedia.org/wiki/Bzip2
所以我知道 CRC 校验和在 bz2 文件中的位置,但我将如何验证它们。我应该binascii.crc32()
获得哪些 CRC?我已经尝试逐字节计算各种块的 CRC,但没有设法得到匹配。
谢谢你。我将研究 bzip2 源代码和bz2
Python 库代码,可能会找到一些东西,尤其是在decompress()
方法中。
更新1:
据我所知,块头由以下标签标识。但是微小的 bz2 文件不包含 ENDMARK 文件。(感谢adw,我们发现应该寻找 ENDMARK 的位移位值,因为压缩数据没有填充到字节。)
这是从bzlib2recover.c
源头开始的,块似乎总是从第 80 位开始,就在 CRC 校验和之前,应该从 CRC 计算中省略,因为不能将自己的 CRC CRC 为相同的 CRC(你明白我的意思) .
查看计算这个的代码。
更新 2:
bzlib2recover.c
没有CRC计算功能,它只是从损坏的文件中复制CRC。但是,我确实设法在 Python 中复制了块计算器功能,以标记bz2
压缩文件中每个块的开始和结束位。回到正轨,我发现它compress.c
指的是bzlib_private.h
.
这些定义也被访问bzlib.c
,s->blockCRC
在 中初始化和更新,在 中bzlib.c
完成compress.c
。有超过 2000 行 C 代码,这需要一些时间来查看并弄清楚哪些内容可以输入,哪些内容不可以。我也将C
标签添加到问题中。
顺便说一下,这里是 bzip2 的 C 源代码http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
更新 3:
原来bzlib2
块 CRC32 是使用以下算法计算的:
dataIn
是要编码的数据。
其中 BZ2_crc32Table 定义在crctable.c
对于dataIn = "justatest"
返回的 CRC 7948C8CB
,使用该数据压缩文本文件后,bz2 文件中的 crc:32 校验和79 48 c8 cb
是匹配的。
结论:
bzlib2 CRC32 是(引用crctable.c
)
由 Rob Warnock 在 comp.compression FAQ 的第 51 节中模糊地派生出来...
...因此,据我了解,不能使用标准 CRC32 校验和计算器预先计算/验证,而是需要bz2lib
实现(第 155-172 行bzlib_private.h
)。