Caching Open Output Filehandles
Problem
You need more output files open simultaneously than your system allows.
Solution
Use the standard FileCache module:
use FileCache; cacheout ($path); # each time you use a filehandle print $path "output";
Discussion
FileCache’s
cacheout
function lets you work with more output files than your operating
system lets you have open at any one time. If you use it to open an
existing file that FileCache is seeing for the first time, the file
is truncated to length zero, no questions asked. However, in its
opening and closing of files in the background,
cacheout
tracks the files it has opened before and
does not overwrite them, but appends to them instead. This does not
create directories for you, so if you give it
/usr/local/dates/merino.ewe to open but the
directory /usr/local/dates doesn’t exist,
cacheout
will die
.
The cacheout()
function checks the value of the
C-level constant NOFILE from the standard system
include file sys/param.h
to determine how many
concurrently open files are allowed on your system. This value can be
incorrect on some systems and even missing on a few (for instance, on
those where the maximum number of open file descriptors is a process
resource limit that can be set with the limit or
ulimit commands). If
cacheout()
can’t get a value for NOFILE,
just set $FileCache::maxopen
to be four less than
the correct value, or choose a reasonable number by trial and error.
Example 7.8 splits an xferlog file created by the popular wuftpd ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.