什么是允许在文件中随机读/写的最佳压缩算法?
我知道任何自适应压缩算法都是不可能的.
我知道霍夫曼编码是不可能的.
有没有人有更好的压缩算法,允许随机读/写?
我认为你可以使用任何压缩算法,如果你用块写它,但理想情况下我不想一次解压缩整个块.但是,如果您有关于简单方法的建议以及如何知道块边界,请告诉我.如果这是您的解决方案的一部分,请告诉我您想要读取的数据是否跨越块边界时要执行的操作?
在您的答案的上下文中,请假设有问题的文件是100GB,有时我想读取前10个字节,有时我想读取最后19个字节,有时我想阅读17中间的字节..
这是我的问题,我有一组大gz日志文件,该行中的第一个信息是日期时间文本,例如:2014-03-20 05:32:00.
我需要检查哪些日志文件包含特定数据.对于init我只需做一个:
'-query-data-'
zgrep -m 1 '^20140320-04' 20140320-0{3,4}*gz
Run Code Online (Sandbox Code Playgroud)
但是如何对最后一行执行相同的操作而不处理整个文件,就像使用zcat(太重)一样:
zcat foo.gz | tail -1
Run Code Online (Sandbox Code Playgroud)
附加信息,这些日志是使用它的初始记录的数据时间创建的,所以如果我想在14:00:00查询日志,我还要在14:00:00之前创建的文件中搜索,作为文件将在13:50:00创建,在14:10:00关闭.
我在Windows操作系统下有一个压缩的二进制文件,我试图用R读取.到目前为止,它使用unz()函数与readBin()函数结合使用.
> bin.con <- unz(zip_path, file_in_zip, open = 'rb')
> readBin(bin.con,
"double",
n = byte_chunk,
size = 8L,
endian = "little")
> close(bin.con)
Run Code Online (Sandbox Code Playgroud)
其中zip_path是zip文件的路径,file_in_zip是zip文件中要读取的文件名,byte_chunk是我想要读取的字节数.
在我的用例中,readBin操作是循环的一部分,并逐渐读取整个二进制文件.但是,我很少想阅读所有内容,而且我经常知道我想要阅读的部分.不幸的是,readBin没有跳过前n个字节的start/skip参数.因此,我尝试用seek()有条件地替换readBin(),以跳过不需要的部分的实际读取.
当我尝试这个时,我收到一个错误:
> bin.con <- unz(zip_path, file_in_zip, open = 'rb')
> seek(bin.con, where = bytes_to_skip, origin = 'current')
Error in seek.connection(bin.con, where = bytes_to_skip, origin = "current") :
seek not enabled for this connection
> close(bin.con)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我没有找到解决此错误的方法.类似的问题可以在这里找到(遗憾的是没有令人满意的答案):
互联网上的提示建议将open ='r'参数添加到unz()或完全删除open参数,但这仅适用于非二进制文件(因为默认为'r').人们还建议首先解压缩文件,但由于文件很大,这实际上是不可能的.
有没有办法解决二进制压缩文件或读取字节偏移量(可能通过Rcpp包使用C++)?
更新:
进一步的研究似乎表明zip文件中的seek() …
我正在订购美国地质勘探局的大堆土地场景,这些场景来自tar.gz档案.我正在编写一个简单的python脚本来解压缩它们.每个存档包含15个60-120 mb大小的tiff图像,总计超过2 gb.我可以使用以下代码轻松提取整个存档:
import tarfile
fileName = "LT50250232011160-SC20140922132408.tar.gz"
tfile = tarfile.open(fileName, 'r:gz')
tfile.extractall("newfolder/")
Run Code Online (Sandbox Code Playgroud)
我实际上只需要15个tiff中的6个,在标题中标识为"乐队".这些是一些较大的文件,因此它们共同占据了大约一半的数据.所以,我认为我可以通过修改代码来加快这个过程,如下所示:
fileName = "LT50250232011160-SC20140922132408.tar.gz"
tfile = tarfile.open(fileName, 'r:gz')
membersList = tfile.getmembers()
namesList = tfile.getnames()
bandsList = [x for x, y in zip(membersList, namesList) if "band" in y]
print("extracting...")
tfile.extractall("newfolder/",members=bandsList)
Run Code Online (Sandbox Code Playgroud)
但是,为两个脚本添加一个计时器显示第二个脚本没有显着的效率增益(在我的系统上,两个脚本在一个场景上运行大约一分钟).虽然提取速度稍微快一点,但似乎这个增益可以通过确定首先需要提取哪些文件所花费的时间来抵消.
问题是,这种权衡取决于我正在做的事情,还是仅仅是我的代码效率低下的结果?我是python的新手,今天才发现tarfile,所以如果后者是真的我也不会感到惊讶,但是我还没有找到任何有效提取存档的部分建议.
谢谢!
我使用gcc 4.5.0和msvc8/9在C++中工作.
我希望能够压缩文件(10 Gb),然后使用我的应用程序打开此文件.
但是,文件内容是这样的,每当我使用它们时,我不一定需要它们内部的所有内容.
因此,例如,有一次我打开其中一个压缩文件,并决定我想在不加载文件的情况下寻找文件的95%.使用像gzip这样的压缩算法,这是不可能的:我必须解压缩文件的前95%,然后才能解压缩最后的5%.
So, are they any libraries similar to gzip, that are open source
and available for commercial use, that have built in check points,
to re-sync the decompression stream?
Run Code Online (Sandbox Code Playgroud)
我认为也许一个失败的音频编解码器可能会成功.我知道其中一些算法有检查点,因此您可以通过音乐文件进行搜索,而不必等待音乐文件的全部内容被解压缩.使用音频编解码器进行数据解压缩是否存在缺陷?
谢谢!
我有一个大gzip文件,我想只阅读部分内容seek.关于seekon gzip文件的使用,这个页面说:
seek()位置与未压缩数据相关,因此调用者甚至不需要知道数据文件是否已压缩.
这是否意味着seek必须从文件开头读取和解压缩数据到目标位置?
compression ×2
gzip ×2
python ×2
algorithm ×1
bash ×1
binary ×1
c++ ×1
grep ×1
huffman-code ×1
logging ×1
open-source ×1
performance ×1
python-2.7 ×1
r ×1
rcpp ×1
seek ×1
shell ×1
tarfile ×1