这与之前的问题类似,但那里的答案不能满足我的需求,我的问题略有不同:
我目前对一些包含排序数据的非常大的文件使用gzip压缩.当文件未被压缩时,二进制搜索是支持在排序数据中寻找位置的便捷有效方式.
但是当文件被压缩时,事情变得棘手.我最近发现了zlib的Z_FULL_FLUSH选项,可以在压缩过程中使用它在压缩输出中插入"同步点"(inflateSync()然后可以从文件中的各个点开始读取).这是可以的,虽然我已经拥有的文件必须重新压缩才能添加此功能(奇怪的gzip是没有这个选项,但如果必须,我愿意编写自己的压缩程序).
从一个来源看来,即使Z_FULL_FLUSH不是一个完美的解决方案......不仅所有gzip档案都不支持它,而且在档案中检测同步点的想法可能会产生误报(或者与同步的幻数重合)点,或由于Z_SYNC_FLUSH也产生同步点但它们不能用于随机访问的事实.
有更好的解决方案吗?如果可能的话,我想避免使用辅助文件进行索引,并且对准随机访问的显式默认支持将是有帮助的(即使它是大粒度的 - 就像能够以每10 MB的间隔开始读取一样).是否有另一种压缩格式比gzip更好地支持随机读取?
编辑:正如我所提到的,我希望在压缩数据中进行二进制搜索.我不需要寻找特定的(未压缩的)位置 - 只是在压缩文件中寻找一些粗粒度.我只是希望能够支持诸如"将数据从大约50%(25%,12.5%等)开始压缩到此压缩文件中".
这是我目前用于提取与脚本位于同一当前工作目录中的zip文件的代码.如何指定要提取的其他目录?
我试过的代码并没有在我想要的地方提取它.
import zipfile
fh = open('test.zip', 'rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
outfile = open(name, 'wb')
outfile.write('C:\\'+z.read(name))
outfile.close()
fh.close()
Run Code Online (Sandbox Code Playgroud) 我正在与服务器连接,该服务器要求发送给它的数据使用Deflate算法(Huffman编码+ LZ77)进行压缩,并且还发送我需要的数据以进行Inflate.
我知道Python包含Zlib,并且Zlib中的C库支持对Inflate和Deflate的调用,但这些显然不是由Python Zlib模块提供的.它提供压缩和解压,但是当我拨打电话,如下列:
result_data = zlib.decompress( base64_decoded_compressed_string )
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error -3 while decompressing data: incorrect header check
Run Code Online (Sandbox Code Playgroud)
Gzip并没有更好; 在打电话时如:
result_data = gzip.GzipFile( fileobj = StringIO.StringIO( base64_decoded_compressed_string ) ).read()
Run Code Online (Sandbox Code Playgroud)
我收到错误:
IOError: Not a gzipped file
Run Code Online (Sandbox Code Playgroud)
这是有道理的数据是平减文件不是真正的Gzip压缩文件.
现在我知道有一个Deflate实现可用(Pyflate),但我不知道Inflate的实现.
似乎有几个选择:
我正在寻求解决方案,但缺乏解决方案,我将感谢见解,建设性意见和想法.
附加信息:为了我需要的目的,放松(和编码)字符串的结果应该与下面的C#代码片段给出相同的结果,其中输入参数是与要压缩的数据相对应的UTF字节数组:
public static …Run Code Online (Sandbox Code Playgroud) 我正在考虑压缩,似乎必须对可以应用于它的压缩进行某种限制,否则它将是单个字节.
所以我的问题是,我之前可以压缩文件多少次:
这两点是相同还是不同?
收益递减点在哪里出现?
如何找到这些要点?
我不是在谈论任何特定的算法或特定文件.
MSDN文档告诉我以下内容:
GZipStream类使用gzip数据格式,该格式包括用于检测数据损坏的循环冗余校验值.gzip数据格式使用与DeflateStream类相同的压缩算法.
似乎GZipStream在输出中添加了一些额外的数据(相对于DeflateStream).我想知道,在什么类型的场景中使用GZipStream而不是DeflateStream是必不可少的?
有没有人知道一个使用NVIDIA的CUDA库实现标准压缩方法(如Zip,GZip,BZip2,LZMA ......)的项目?
我想知道是否能够利用大量并行任务(如压缩)的算法在显卡上的运行速度要比使用双核或四核CPU快得多.
您如何看待这种方法的优缺点?
我刚看过拉链炸弹,即包含大量高度可压缩数据(00000000000000000 ...)的zip文件.
打开时,它们会填满服务器的磁盘.
在解压缩之前,如何检测zip文件是拉链炸弹?
更新你能告诉我在Python或Java中是如何完成的?
我使用GZIPOutputStream或ZIPOutputStream压缩一个String(我string.length()的小于20),但压缩结果比原始字符串长.
在某些网站上,我发现有些朋友说这是因为我原来的字符串太短,GZIPOutputStream可以用来压缩更长的字符串.
那么,有人可以给我一个压缩字符串的帮助吗?
我的功能如下:
String compress(String original) throws Exception {
}
Run Code Online (Sandbox Code Playgroud)
更新:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import java.util.zip.*;
//ZipUtil
public class ZipUtil {
public static String compress(String str) {
if (str == null || str.length() == 0) {
return str;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
gzip.close();
return out.toString("ISO-8859-1");
}
public static void main(String[] args) throws IOException {
String string = "admin";
System.out.println("after compress:"); …Run Code Online (Sandbox Code Playgroud)