NAME
   Tie::Array::Pack - An array implemented as a packed string

SYNOPSIS
     use Tie::Array::Pack
     tie @array, Tie::Array::Pack => 'l';
     $array[$_] = rand for (1..1e6); # slow but memory-efficient

INSTALLATION
   To install this module type the following as usual.

      perl Makefile.PL
      make
      make test
      make install

DESCRIPTION
   One of the drawbacks for using Perl's native array is that it is a
   memory-hog. Normally it takes 20 bytes a scalar (16 bytes for scalar +
   overhead). This can be a problem when you need to handle millions of
   numbers in-memory. This module saves memory in exchange for speed.

   With this module all you have to do is

     tie @array, Tie::Array::Pack => $fmt

   where $fmt is one of the following that is supported by pack().

       c   A signed char value.
       C   An unsigned char value.
       s   A signed short value.
       S   An unsigned short value.
       i   A signed integer value.
       I   An unsigned integer value.
       l   A signed long value.
       L   An unsigned long value.
       n   An unsigned short in "network" (big-endian) order.
       N   An unsigned long in "network" (big-endian) order.
       v   An unsigned short in "VAX" (little-endian) order.
       V   An unsigned long in "VAX" (little-endian) order.
       q   A signed quad (64-bit) value.
       Q   An unsigned quad value.
       j   A signed integer value (a Perl internal integer, IV).
       J   An unsigned integer value (a Perl internal unsigned integer, UV).
       f   A single-precision float in the native format.
       d   A double-precision float in the native format.
       F   A floating point value in the native native format
       D   A long double-precision float in the native format.

   If the format is not supported, it simply croaks.

 EXPORT
   None.

 EMPTY ELEMENT
   You can optionally specify the value which spefies the empty element as
   follows;

     tie @array, Tie::Array::Pack => l, -1; # -1 represents an empty value;

   The default value is 0. Since this stores data in the packed string, the
   array is never sparse. To illustrate the issue, try the following;

     tie @array, Tie::Array::Pack => d;
     $array[4] = 2;
     print join(",", @array), "\n" # 0,0,0,0,2;

 PICK THE RIGHT FORMAT
   Another issue is that you need to pick the right format or you will get
   an unexpected result.

     tie @array, Tie::Array::Pack => C;
     @array = (251..260);
     print join(",", @array), "\n" # 251,252,253,254,255,0,1,2,3,4

   In this case, the warning is issued.

 HOW SLOW IS IT?
   Since this module has to pack() for each STORE and unpack() for each
   FETCH, it is much slower than the native array. Still it is almost as
   fast as in-memory DB_File (with $DB_RECNO) and much, much faster than
   Tie::File. Below is the result on my MacBook Pro.

   n = 1000
                 Rate    T::F T::A::P DB_File  native
       T::F    3.77/s      --    -98%    -98%   -100%
       T::A::P  155/s   4018%      --     -5%    -93%
       DB_File  163/s   4214%      5%      --    -92%
       native  2073/s  54913%   1236%   1175%      --

   n = 10000
                 Rate    T::F T::A::P DB_File  native
       T::F    1.06/s      --    -93%    -94%    -99%
       T::A::P 15.5/s   1365%      --     -7%    -92%
       DB_File 16.6/s   1469%      7%      --    -91%
       native   194/s  18248%   1153%   1069%      --

SEE ALSO
   In Perl Core:
     perltie, perlpacktut, Tie::Array, Tie::File, DB_File

   On CPAN
     Tie::Array::Packed and Tie::Array::PackedC - Almost identical except
     for the interfaces. This module is simpler and pure-perl only.

AUTHOR
   Dan Kogai, <[email protected]<gt>

COPYRIGHT AND LICENSE
   Copyright (C) 2006 by Dan Kogai

   This library is free software; you can redistribute it and/or modify it
   under the same terms as Perl itself, either Perl version 5.8.8 or, at
   your option, any later version of Perl 5 you may have available.