|
|||||||||
NAMETie::MmapArray - mmap a file as a tied array
SYNOPSIS
use Tie::MmapArray;
tie @array, 'Tie::MmapArray', $filename; tie @array, 'Tie::MmapArray', $filename, $template; tie @array, 'Tie::MmapArray', $filename, { template => $template, nels => 0, mode => "rw", shared => 1, offset => 0 };
DESCRIPTIONThe Tie::MmapArray module lets you use mmap to map in a file as a perl array rather than reading the file into dynamically allocated memory. It depends on your operating system supporting UNIX or POSIX.1b mmap, of course. (Code to use the equivalent functions on Win32 platforms has been contributed but has not been tested yet.)
The type of array elements is defined by the template argument or option. This is a Perl The following example shows the utmp file on Linux mapped to an array:
tie @utmp, 'Tie::MmapArray', '/var/log/utmp', [ ut_type => 's', ut_pid => 'i', # pid_t ut_line => 'a12', ut_id => 'a4', ut_user => 'a32', ut_host => 'a256', ut_exit => [ # struct exit_status e_termination => 's', e_exit => 's' ], ut_session => 'l', ut_tv => [ # struct timeval tv_sec => 'l' tv_usec => 'l' ], ut_addr_v6 => 'l4', pad => 'a20' ]; This can be scanned as follows:
for (my $i = 0; $i < @utmp; $i++) { print("pid: %d, user: %s\n", $utmp[$i]->{ut_pid}, $utmp[$i]->{ut_user}); }
The following subset of
The size of the array is defined by the nels option. If this is zero then it is calculated as the file size divided by the element size. If the file size is smaller than the size required for the requested elements then a single zero byte will be written to the final byte of the requested size. This seems to prevent the module dying with a segmentation or bus error if memory is accessed beyond the end of the file and generally results in a file with holes (unallocated blocks). Precise details of the behaviour of the module are subject to change.
BUGS, RESTRICTIONS AND FUTURE DIRECTIONSThis is version 0.02 of the module and there are likely to be many bugs. The interface may change as the result of feedback. The options mode and shared are not yet used. Not all pack letters are implemented yet. push, pop, shift, unshift, and splice operations are not yet supported. It is debateable whether they should be as they could be very expensive if the mmaped file was large (say a Gigabyte or two). Perhaps there should be an option to explicitly allow these operations.
AUTHORAndrew Ford <[email protected]>, 27 December 1999.
CREDITSThe module was inspired by Malcolm Beatie's Mmap module. Reini Urban <[email protected]> provided intial code for Win32 platforms. |
||||||
Copyright © 1996-2002 Ford & Mason Ltd |