Data compression on the iSeries 400

Did you know software compression is available on the iSeries? Check out this tip for the details.

Hardware compression has been available on the iSeries 400 for some time. But did you know that software compression is also available, and it's relatively easy to use?

IBM offers two algorithms: simple terse (whatever that is) and IBM LZ1. The latter is IBM's patented implementation of the Lempel-Ziv algorithm, used in WinZip and pkzip. In my experience, this algorithm is much the better of the two, so I'll cover LZ1 here.

To use compression, you need to provide the address and length of the source and result strings, and the algorithm number. (1=Simple Terse, 2=IBM LZ1.) These details are placed in a data structure, known as a template. The address of the template is then passed to the MI builtin function.

The compress function will populate the result field, and place the length of the compressed string in CompressLen. In this example, CompressLen = 65. That's an excellent compression ratio, but this a rather contrived example!

Decompression is similar. Note that we do not need to provide the source length or algorithm number. The decompress function can determine these from the compressed string.

The decompress function will populate the result field, and place the length of the decompressed string in decompresslen. You must be sure to provide a long enough result field. Often you will know the original string length, so this will not be a problem.

So when is compression useful? Recently I needed to store an audit trail of seven days' worth of data (approximately 70000 records) as received via MQ Series. The data arrived as one long string, 10800 bytes long. That's an uncompressed length of over 700MB. The data contained lots of blanks and zeroes, and was an ideal candidate for compression. By storing the compressed data in a variable length field in the audit file, I was able to reduce the storage requirements by a factor of 15. Very useful and quite straightforward!


Compression example:

 
 * Prototype for MI builtin function:
D Compress        pr                  Extproc('_CPRDATA')
D  RcvrPtr                        *   Value

 * Compression template:
D Rcvr            ds
D  SourceLen                    10i 0 Inz(%Size(Source))
D  ResultLen                    10i 0 Inz(%Size(Result))
D  CompressLen                  10i 0 Inz(0)
D  Algorithm                     5i 0 Inz(2)
D                               18    Inz(*LOVAL)
D  SourcePtr                      *   Inz(%Addr(Source))
D  ResultPtr                      *   Inz(%Addr(Result))

D Source          s           2400    Inz(*ALL'The cat sat on the mat. ')
D Result          s           2400

C                   CallP     Compress (%Addr(Rcvr))


Decompression example:

 * Prototype for MI builtin function:
D Decompress      pr                  Extproc('_DCPDATA')
D  RcvrPtr                        *   Value

 * Decompression template:
D Rcvr            ds
D                                4    Inz(*LOVAL)
D  ResultLen                    10i 0 Inz(%Size(Result))
D  DecompressLen                10i 0 Inz(0)
D                               20    Inz(*LOVAL)
D  SourcePtr                      *   Inz(%Addr(Source))
D  ResultPtr                      *   Inz(%Addr(Result))

D Source          s           2400
D Result          s           2400

C                   CallP     Decompress (%Addr(Rcvr))

==================================
MORE INFORMATION ON THIS TOPIC
==================================

The Best Web Links: tips, tutorials and more.

Ask your programming questions--or help out your peers by answering them--in our live discussion forums.

Ask the Experts yourself: Our application development gurus are waiting to answer your programming questions.

This was first published in January 2002

Dig deeper on iSeries CL programming

0 comments

Oldest 

Forgot Password?

No problem! Submit your e-mail address below. We'll send you an email containing your password.

Your password has been sent to:

-ADS BY GOOGLE

SearchEnterpriseLinux

SearchDataCenter

Close