使用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()解压。
0 评论:
发表评论