打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
编译器从业者 (Beta): 使用zlib库压缩数据

星期三, 十一月 29, 2006

使用zlib库压缩数据

在分析程序性能的时候,经常需要获得程序的运行踪迹,比如程序的访存踪迹,跳转指令踪迹等。如果评测程序的动态指令数很多,则生成的踪迹数据也会很大。以SPEC2000整点程序(使用train输入)为例,动态指令数通常在几十到几百亿条左右,以4 bytes来描述一条指令的话,生成的踪迹大小为十G级别,那么这套测试集的踪迹需要百G的磁盘空间。

为了控制踪迹数据的大小,可以使用zlib库来压缩踪迹数据。zlib提供了一批函数来压缩数据。有多种方案可以选择。

  1. 使用gzwrite(gzFile file, const voidp buf, unsigned len)函数
    设置一个buf来存放踪迹,比如64M大小(主要是为了减少压缩函数的调用次数),当buf满的时候,调用gzwrite压缩该buf并写到踪迹文件中。注意该函数的每次调用都会对整个文件进行一次整体处理,因此最终生成的压缩文件可以用gzip解压。
    对踪迹数据进行分析的时候,可以调用gzread()函数读取。
  2. 使用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倍。

 

0 评论:

 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
漫谈linux文件IO
zlib的uncompress函数出现Z_BUF_ERROR的原因
转载:MFC文件操作,很全面
文件操作
什么是文件系统?
C/C++文件的操作(fread() fwrite())
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服