junhuster / Utility

Utility Repository is used to host several light weigtht apps, such as Jcompress which is a app to compress or Uncompress file. More apps will be added later
http://www.cnblogs.com/junhuster/
GNU General Public License v3.0
18 stars 6 forks source link

您好,我想询问一下关于读写文件的事情? #1

Open Luodian opened 7 years ago

Luodian commented 7 years ago

我也正在写有关于哈夫曼压缩的程序(课程作业),我在创建.compress文件之前都没有什么问题,但是读入.compress文件之后,却发现由char转换来的二进制编码和原来的编码不同,这导致我的文件解压之后会和原来的有所不同,很伤心,能够请教您一下你是怎么处理写入.compress文件,以及解压.compress文件这个过程吗?我使用c++的fstream读写文件。

junhuster commented 7 years ago

你好,非常抱歉,由于我偶尔登录github,再加上是刚开始使用github.没能及时看见你的问题。 我在写huffman压缩算法时,编码之后的结果,假如是0110字符串的话,写入压缩文件里是以bit的方式写入的(用的是fwrite函数,二进制方式),需要使用位操作把8个bit组成一个unsigned char来写入,注意要用unsigned char. char实际上也是有符号的。然后解压的时候读取文件用fread以二进制方式读取,当然为了还原编码,同样需要使用位操作来解析压缩文件,然后再用huffman解码算法解码。你可以仔细看下我github里面的代码。另外我的博客是:http://www.cnblogs.com/junhuster/p/junhuster.html ,你可以结合这篇博客来理解。

Luodian commented 7 years ago

恩,我后来处理好了这些东西,但是还有一个问题就是,我发现我在压缩歌曲,图片这样的东西的时候,压缩率十分的不堪,大约在1%左右,而且内存占用十分的高,请问您的程序是怎么做到可以压缩视频这样大的文件的呢?您是怎么解决呢?

junhuster commented 7 years ago

你好,其实我的算法压缩率也不高,对于视频我用好压与我的算法压缩率都不高,因为有些视频格式本身就是经过压缩的,我怀疑歌曲也是。另外对于文本文件压缩还可以,但是比不上好压,原因在于好压使用了更为高效的压缩算法,好像叫lz77算法。你可以搜下其他压缩算法。哈夫曼应该属于经典算法,但没有真正广泛应用……话说你后来是怎么解决的,原因是啥啊?

Luodian commented 7 years ago

我处理了一些小的bug,然后使用了fstream的write和read方法,进行区块的读入然后处理,就能够压缩任意格式了,但是还是压缩的文件达到10M左右就会很慢,大约一两分钟压缩成功,而且内存占用率极高,这点不知道该怎么处理。

junhuster commented 7 years ago

我印象中,我压缩小几十兆的文件还挺快的,压缩1G的视频文件很慢,需要几分钟。我觉得是不是你写入磁盘的操作太频繁了,弄一个大一点的内存缓冲区,积累到一定量再写入磁盘。不过内存使用率我没在意。我今晚回去再跑一边看看耗时和内存使用情况,再告诉你,。不过我换电脑了,i7 7700和16g内存,我估计应该比我看电脑快很多

junhuster commented 7 years ago

刚才我重新编译测试了JCompress,当我用30M的codebloks.exe测试时,从windows进程管理器中看到压缩/解压所消耗的cpu,内存,磁盘分别是18.7%,8.7M左右,6M/s,压缩用了5s,解压4s。然后我又用1.4G的速度与激情rmvb格式的电影测试,解压与压缩所消耗的cpu,内存,磁盘与前者类似,压缩用了232s,解压用了194s。当我用快压软件测试速度与激情时,cpu,内存使用率与JCompress类似,但是磁盘速度提高到了21M/s,结果导致速度快了很多。我感觉磁盘性能似乎是影响效率的关键因素。1.4G的电影,快压压缩后节省了20M空间,JCompress压缩后只节省了1M的空间。