使用zlib庫壓縮數據
在分析程序性能的時(shí)候,經(jīng)常需要獲得程序的運行蹤跡,比如程序的訪(fǎng)存蹤跡,跳轉指令蹤跡等。如果評測程序的動(dòng)態(tài)指令數很多,則生成的蹤跡數據也會(huì )很大。以SPEC2000整點(diǎn)程序(使用train輸入)為例,動(dòng)態(tài)指令數通常在幾十到幾百億條左右,以4 bytes來(lái)描述一條指令的話(huà),生成的蹤跡大小為十G級別,那么這套測試集的蹤跡需要百G的磁盤(pán)空間。
為了控制蹤跡數據的大小,可以使用zlib庫來(lái)壓縮蹤跡數據。zlib提供了一批函數來(lái)壓縮數據。有多種方案可以選擇。
- 使用gzwrite(gzFile file, const voidp buf, unsigned len)函數
設置一個(gè)buf來(lái)存放蹤跡,比如64M大?。ㄖ饕菫榱藴p少壓縮函數的調用次數),當buf滿(mǎn)的時(shí)候,調用gzwrite壓縮該buf并寫(xiě)到蹤跡文件中。注意該函數的每次調用都會(huì )對整個(gè)文件進(jìn)行一次整體處理,因此最終生成的壓縮文件可以用gzip解壓。
對蹤跡數據進(jìn)行分析的時(shí)候,可以調用gzread()函數讀取。
- 使用compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)和fwrite()
之所以提出這種方法,主要是第一種方法在32位機器上無(wú)法處理超過(guò)2G的大文件,會(huì )報file limit exceeds錯誤,這可能是因為gzwrite沒(méi)考慮大文件的處理(發(fā)信問(wèn)zlib作者,還沒(méi)回我)。因此就輾轉使用fwrite來(lái)解決大文件處理問(wèn)題。因為通過(guò)-D_FILE_OFFSET_BITS=64參數可以使得fwrite和fread處理超過(guò)2G的大文件。
具體的使用還是設置一個(gè)buf,通過(guò)compress壓縮后,調用fwrite寫(xiě)到蹤跡文件中??紤]到將來(lái)要讀取,因此也要把壓縮前后數據的大小也寫(xiě)到文件中。讀取的時(shí)候,先f(wàn)read讀出每個(gè)壓縮塊數據的大小,再讀取相應大小的壓縮數據,使用uncompress()解壓。




0 評論:
發(fā)表評論