什么是允许在文件中随机读/写的最佳压缩算法?
我知道任何自适应压缩算法都是不可能的.
我知道霍夫曼编码是不可能的.
有没有人有更好的压缩算法,允许随机读/写?
我认为你可以使用任何压缩算法,如果你用块写它,但理想情况下我不想一次解压缩整个块.但是,如果您有关于简单方法的建议以及如何知道块边界,请告诉我.如果这是您的解决方案的一部分,请告诉我您想要读取的数据是否跨越块边界时要执行的操作?
在您的答案的上下文中,请假设有问题的文件是100GB,有时我想读取前10个字节,有时我想读取最后19个字节,有时我想阅读17中间的字节..
根据此链接如何使用.NET创建7-Zip存档?,WOPR告诉我们如何使用7z SDK(http://www.7-zip.org/sdk.html )使用LMZA(7z压缩算法)压缩文件
using SevenZip.Compression.LZMA;
private static void CompressFileLZMA(string inFile, string outFile)
{
SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();
using (FileStream input = new FileStream(inFile, FileMode.Open))
{
using (FileStream output = new FileStream(outFile, FileMode.Create))
{
coder.Code(input, output, -1, -1, null);
output.Flush();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是如何解压呢?
我尝试:
private static void DecompressFileLZMA(string inFile, string outFile)
{
SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();
using (FileStream input = new FileStream(inFile, FileMode.Open))
{
using (FileStream output = new FileStream(outFile, FileMode.Create))
{
coder.Code(input, output, input.Length, …Run Code Online (Sandbox Code Playgroud) 我正在创建一个夜间数据库模式文件,并希望将每晚创建的所有文件(每个数据库一个)放入一个文件夹并压缩该文件夹.我有一个创建数据库的的schema.Only创建脚本,然后将所有的文件到一个新的文件夹中的PowerShell脚本.问题在于该过程的压缩部分.
有没有人知道是否可以使用预先安装的处理文件夹压缩的Windows实用程序来完成此操作?
如果可能的话,最好使用该实用程序,而不是像7zip这样的东西(我不想在每个客户的服务器上安装7zip,如果我问他们可能需要IT年数才能完成).
我在S3上有一个17.7GB的文件.它是作为Hive查询的输出生成的,并且未进行压缩.
我知道通过压缩它,它将是大约2.2GB(gzip).当传输是瓶颈(250kB/s)时,如何在本地尽快下载此文件.
我没有找到任何直接的方法来压缩S3上的文件,或者在s3cmd,boto或相关工具中启用传输压缩.
我认为这可能是一个经典问题,但我不知道答案.一个程序可以输出自己的副本,如果有的话,是否有一个简短的程序来执行此操作?
我不接受"空程序"作为答案,我不接受有权访问自己的源代码的程序.相反,我在想这样的事情:
int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf...
Run Code Online (Sandbox Code Playgroud)
但我不知道如何继续......
我正在尝试利用Zlib进行文本压缩.
例如,我有一个字符串,T='blah blah blah blah'我需要为此字符串压缩它.我S=zlib.compress(T)用来压缩它.现在我想要的是获得非二进制形式,S以便我可以解压缩T但在不同的程序中.
谢谢!
编辑:我想我有一个解决我想要的方法.这是方法:
import zlib, base64
text = 'STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW '
code = base64.b64encode(zlib.compress(text,9))
print code
Run Code Online (Sandbox Code Playgroud)
这使:
eNoLDnF09lbwD3MNcvPxD1cIHhxcAE9UKaU=
Run Code Online (Sandbox Code Playgroud)
现在我可以将此代码复制到另一个程序以获取原始变量:
import zlib, base64
s='eNoLDnF09lbwD3MNcvPxD1cIHhxcAE9UKaU='
data = zlib.decompress(base64.b64decode(s))
print data
Run Code Online (Sandbox Code Playgroud)
如果您知道任何其他压缩方法可以提供与上述代码一致的更好结果,请建议.
我想编写一个存储后端来存储更大的数据块.数据可以是任何数据,但主要是二进制文件(图像,pdf,jar文件)或文本文件(xml,jsp,js,html,java ...).我发现大部分数据已经被压缩了.如果所有内容都已压缩,则可以节省大约15%的磁盘空间.
我正在寻找最有效的算法,可以高概率地预测一块数据(比如说128 KB)是否可以被压缩(无损压缩),而不必在可能的情况下查看所有数据.
压缩算法将是LZF,Deflate或类似的东西(可能是Google Snappy).因此,预测数据是否可压缩应该比压缩数据本身快得多,并且使用更少的内存.
我已经知道的算法:
尝试压缩数据的一个子集,比方说128个字节(这有点慢)
计算128个字节的总和,如果它在一定范围内,则它可能不可压缩(在128*127的10%范围内)(这很快,相对较好,但我正在寻找更可靠的东西,因为算法实际上只查看每个字节的最高位)
查看文件头(相对可靠,但感觉像作弊)
我想一般的想法是我需要一种能够快速计算字节列表中每个位的概率是否大约为0.5的算法.
我已经实现了"ASCII检查","熵计算"和"简化压缩",并且都能提供良好的结果.我想改进算法,现在我的想法是不仅要预测数据是否可以被压缩,还要预测它可以被压缩多少.可能使用算法的组合.现在如果我只能接受多个答案......我会接受给出最佳结果的答案.
其他答案(新想法)仍然欢迎!如果可能,使用源代码或链接:-)
现在在Linux中实现了类似的方法.
我发现7-zip很棒,我想在.net应用程序上使用它.我有一个10MB的文件(a.001),它需要:

2秒编码.
如果我能在c#上做同样的事情,那将会很好.我已经下载了http://www.7-zip.org/sdk.html LZMA SDK c#源代码.我基本上将CS目录复制到visual studio中的控制台应用程序中:

然后我编译和eveything编译顺利.所以在输出目录中我放置了a.00110MB大小的文件.关于我放置的源代码的主要方法:
[STAThread]
static int Main(string[] args)
{
// e stands for encode
args = "e a.001 output.7z".Split(' '); // added this line for debug
try
{
return Main2(args);
}
catch (Exception e)
{
Console.WriteLine("{0} Caught exception #1.", e);
// throw e;
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行控制台应用程序时,应用程序运行良好,我得到a.7z工作目录上的输出.问题是需要很长时间.执行大约需要15秒!我也试过/sf/answers/614314921/方法,这也需要很长时间.为什么它比实际程序慢10倍?
即使我设置只使用一个线程:

它仍然需要更少的时间(3秒对15):
可能是因为C#比汇编还是C慢?我注意到该算法执行了大量繁重的操作.例如,比较这两个代码块.他们都做同样的事情:
#include <time.h>
#include<stdio.h>
void main()
{
time_t now;
int i,j,k,x;
long …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我正在尝试上传用户从图库中选择的一些视频.问题是通常android视频文件太大而无法上传,因此我们希望首先通过较低的比特率/分辨率来压缩它们.
我刚刚听说过使用API 16引入的新MediaCodec api(我以前试图用ffmpeg这样做).
我现在正在做的是:首先使用视频解码器解码输入视频,并使用从输入文件中读取的格式对其进行配置.接下来,我创建了一个带有一些预定义参数的标准视频编码器,并用它来编码解码器输出缓冲区.然后我将编码器输出缓冲区保存到文件中.
一切看起来都很好 - 从每个输入和输出缓冲区写入和读取相同数量的数据包,但最终文件看起来不像视频文件,任何视频播放器都无法打开.
看起来解码没问题,因为我通过在Surface上显示它来测试它.我首先配置解码器以使用Surface,当我们调用releaseOutputBuffer时,我们使用render标志,我们可以在屏幕上看到视频.
这是我正在使用的代码:
//init decoder
MediaCodec decoder = MediaCodec.createDecoderByType(mime);
decoder.configure(format, null , null , 0);
decoder.start();
ByteBuffer[] codecInputBuffers = decoder.getInputBuffers();
ByteBuffer[] codecOutputBuffers = decoder.getOutputBuffers();
//init encoder
MediaCodec encoder = MediaCodec.createEncoderByType(mime);
int width = format.getInteger(MediaFormat.KEY_WIDTH);
int height = format.getInteger(MediaFormat.KEY_HEIGHT);
MediaFormat mediaFormat = MediaFormat.createVideoFormat(mime, width, height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 400000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 25);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
encoder.configure(mediaFormat, null , null , MediaCodec.CONFIGURE_FLAG_ENCODE);
encoder.start();
ByteBuffer[] encoderInputBuffers = encoder.getInputBuffers();
ByteBuffer[] encoderOutputBuffers = encoder.getOutputBuffers();
extractor.selectTrack(0);
boolean sawInputEOS = false; …Run Code Online (Sandbox Code Playgroud) 与我的其他问题有关,但有所不同:
someMap.saveAsTextFile("hdfs://HOST:PORT/out")
Run Code Online (Sandbox Code Playgroud)
如果我将RDD保存到HDFS,如何通过gzip告诉spark压缩输出?在Hadoop中,可以设置
mapred.output.compress = true
Run Code Online (Sandbox Code Playgroud)
并选择压缩算法
mapred.output.compression.codec = <<classname of compression codec>>
Run Code Online (Sandbox Code Playgroud)
我如何在火花中做到这一点?这会有效吗?
编辑:使用spark-0.7.2
compression ×10
7zip ×2
c# ×2
lzma ×2
algorithm ×1
amazon-s3 ×1
android ×1
apache-spark ×1
command-line ×1
emr ×1
hdfs ×1
hive ×1
huffman-code ×1
java ×1
performance ×1
powershell ×1
python ×1
quine ×1
scala ×1
sdk ×1
video ×1
windows ×1