编译器从业者 (Beta): 使用zlib库压缩数据
来源:百度文库 编辑:神马文学网 时间:2024/04/30 16:19:43
skip to main |skip to sidebar编译器从业者 (Beta)
不靠谱的世界里 | http://compiler.yingbo.com
星期三, 十一月 29, 2006
使用zlib库压缩数据
在分析程序性能的时候,经常需要获得程序的运行踪迹,比如程序的访存踪迹,跳转指令踪迹等。如果评测程序的动态指令数很多,则生成的踪迹数据也会很大。以SPEC2000整点程序(使用train输入)为例,动态指令数通常在几十到几百亿条左右,以4 bytes来描述一条指令的话,生成的踪迹大小为十G级别,那么这套测试集的踪迹需要百G的磁盘空间。
为了控制踪迹数据的大小,可以使用zlib库来压缩踪迹数据。zlib提供了一批函数来压缩数据。有多种方案可以选择。
使用gzwrite(gzFile file, const voidp buf, unsigned len)函数
设置一个buf来存放踪迹,比如64M大小(主要是为了减少压缩函数的调用次数),当buf满的时候,调用gzwrite压缩该buf并写到踪迹文件中。注意该函数的每次调用都会对整个文件进行一次整体处理,因此最终生成的压缩文件可以用gzip解压。
对踪迹数据进行分析的时候,可以调用gzread()函数读取。
使用compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)和fwrite()
之所以提出这种方法,主要是第一种方法在32位机器上无法处理超过2G的大文件,会报file limit exceeds错误,这可能是因为gzwrite没考虑大文件的处理(发信问zlib作者,还没回我)。因此就辗转使用fwrite来解决大文件处理问题。因为通过-D_FILE_OFFSET_BITS=64参数可以使得fwrite和fread处理超过2G的大文件。
具体的使用还是设置一个buf,通过compress压缩后,调用fwrite写到踪迹文件中。考虑到将来要读取,因此也要把压缩前后数据的大小也写到文件中。读取的时候,先fread读出每个压缩块数据的大小,再读取相应大小的压缩数据,使用uncompress()解压。
目前的评测发现对指令踪迹的压缩率通常大于10,有些情况下达到40;对评测时间的影响可以接受,时间为原来的1.5-2倍。
发表者 Yingbo 以7:24 上午
标签:编译器
0 评论:
发表评论
较旧的文章主页
订阅:帖子评论 (Atom)
我的简介
YingboGCC, Programming Language, C ...
查看我的完整个人资料
不吃米饭 blog.yingbo.com
分享色彩 photo.yingbo.com
标签
编译器 (6)gcc (3)c语言 (2)书籍 (1)
Links
GCC Glibc Bintuils
©2006 compiler.yingbo.com 京ICP备06004668号
不靠谱的世界里 | http://compiler.yingbo.com
星期三, 十一月 29, 2006
使用zlib库压缩数据
在分析程序性能的时候,经常需要获得程序的运行踪迹,比如程序的访存踪迹,跳转指令踪迹等。如果评测程序的动态指令数很多,则生成的踪迹数据也会很大。以SPEC2000整点程序(使用train输入)为例,动态指令数通常在几十到几百亿条左右,以4 bytes来描述一条指令的话,生成的踪迹大小为十G级别,那么这套测试集的踪迹需要百G的磁盘空间。
为了控制踪迹数据的大小,可以使用zlib库来压缩踪迹数据。zlib提供了一批函数来压缩数据。有多种方案可以选择。
使用gzwrite(gzFile file, const voidp buf, unsigned len)函数
设置一个buf来存放踪迹,比如64M大小(主要是为了减少压缩函数的调用次数),当buf满的时候,调用gzwrite压缩该buf并写到踪迹文件中。注意该函数的每次调用都会对整个文件进行一次整体处理,因此最终生成的压缩文件可以用gzip解压。
对踪迹数据进行分析的时候,可以调用gzread()函数读取。
使用compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)和fwrite()
之所以提出这种方法,主要是第一种方法在32位机器上无法处理超过2G的大文件,会报file limit exceeds错误,这可能是因为gzwrite没考虑大文件的处理(发信问zlib作者,还没回我)。因此就辗转使用fwrite来解决大文件处理问题。因为通过-D_FILE_OFFSET_BITS=64参数可以使得fwrite和fread处理超过2G的大文件。
具体的使用还是设置一个buf,通过compress压缩后,调用fwrite写到踪迹文件中。考虑到将来要读取,因此也要把压缩前后数据的大小也写到文件中。读取的时候,先fread读出每个压缩块数据的大小,再读取相应大小的压缩数据,使用uncompress()解压。
目前的评测发现对指令踪迹的压缩率通常大于10,有些情况下达到40;对评测时间的影响可以接受,时间为原来的1.5-2倍。
发表者 Yingbo 以7:24 上午
标签:编译器
0 评论:
发表评论
较旧的文章主页
订阅:帖子评论 (Atom)
我的简介
YingboGCC, Programming Language, C ...
查看我的完整个人资料
不吃米饭 blog.yingbo.com
分享色彩 photo.yingbo.com
标签
编译器 (6)gcc (3)c语言 (2)书籍 (1)
Links
GCC Glibc Bintuils
©2006 compiler.yingbo.com 京ICP备06004668号
编译器从业者 (Beta): 使用zlib库压缩数据
压缩解压缩的函数库zlib的使用--gqlyxg1981的博客
压缩解压缩的函数库zlib的使用--gqlyxg1981的博客
PHP的GZIP压缩页面例子,使用zlib扩展实现页面GZIP压缩输出
从lex&yacc说到编译器(二):flex的使用--我的博客2
从lex&yacc说到编译器(二):flex的使用--我的博客
如何使用gcc编译器?
J2ME下的Zlib/Gzip/Zip压缩相关
从lex&yacc说到编译器(一):正则表达式
使用zlib对swf压缩文件进行解压缩
使用zlib对swf压缩文件进行解压缩
PHP使用zlib扩展实现页面GZIP压缩输出 - 『PHP/Perl编程专区』 - 台州站长论坛 |台州论坛|站长论坛|TVB电视剧|PHP论坛|MYSQL论坛|Ajax论坛|DIV CSS论坛|J
怎样识别IT从业者
编译器
gcc编译器使用入门--溪流百里凉
gcc编译器使用入门--溪流百里凉
使用C编译器产生清晰的二进制文件
使用zlib对swf压缩文件进行解压缩--学习纪事
从lex&yacc说到编译器(一):正则表达式--我的博客
Zlib库的版本及下载地址
Re: 请问有谁用过zlib库的?
idata(keil编译器瑕疵)
广州娱乐场所从业者提取DNA后方可上岗(图)
一个已经成功移民的房地产从业者的自白(申请加精)