- 论坛徽章:
- 1
|
本帖最后由 noword2k 于 2012-01-18 21:06 编辑
先来说说“直接载入内存”。
对于不压缩的数据,直接开malloc一块内存,然后直接fopen/fread,这块内存就此保留下来了,根据索引信息,直接读取这些数据,没有什么memcpy,没有对象序列化。
而压缩的数据,只是在最前面多一步解压缩而已。
如果flash要在载入时解析的话,就需要malloc一块内存,然后fopen/fread,然后再malloc一块内存(由于是变长的,此时还不知道究竟需要多大的内存,falsh文件里是没有这个数值的,这又多了一个动态内存的管理的开销),将解析出来的新数据,写入到新的内存中。而这样做的好处无法是非常有限的减少了文件的体积,坏处是大大增加了内存和CPU的损耗。
而问题时,减少文件的体积,是压缩算法的工作,根本不应该在数据结构层面上去考虑。
如果这种减少文件体积的方法非常有效的话,flash也不需要在版本 6 以后,推出支持 zlib 压缩的版本了。
-------------------------------------------------
关于信息量的问题。
如果信息量相同,不管你使用什么样的数据结构,用一个给力的压缩算法压缩后,彼此间的大小会非常接近。
为此,我写了个程序来验证一下。(见附件,用python编写,需要到googlecode下载一个bitstring模块)
flash中有一个变长的Rectangle record,保存4个值。这是需要使用的第一种数据结构。
第二种结构,用int32来保存这4个值。
第三种结构,用int64来保存这4个值。
生成随机数,往这3种结构里写入相同的数值,各10000组,然后分别用普通的zlib,和最高强度的zlib压缩这些数据。
结果如下:
| 原始数据 | 比率 | zlib普通压缩 | 比率 | zlib level9压缩 | 比率 | rect | 59954 | 1 | 55862 | 1 | 55862 | 1 | int32 | 160000 | 2.6687126797 | 66966 | 1.198775554 | 60056 | 1.0750778705 | int64 | 320000 | 5.3374253594 | 73019 | 1.3071318607 | 66414 | 1.1888940604 |
可以看到,虽然原始的数据相差很大,但是由于信息量相同,压缩后他们的大小差的并不大,并且随着压缩等级的提高,这种差别会越来越小。
zlib是一种比较古老的压缩算法,将原始数据保存出来后,我用7zip(lzma算法)压缩了一下,大小如下。
55,892 rect.7z
49,593 int32.7z
49,700 int64.7z
验证了我前面说的,“说不定还是定长比较小呢”。
test_strcut.zip
(978 Bytes, 下载次数: 14)
|
|