Item Description: Quick lookup of values in sorted text files
Review Synopsis:
Mandatory background story
I had an end-of-day job that was taking too much time, and it turns out that the problem was retrieving the closing time values from several textual log files, using a sequential scan.
I knew the answer was to do a binary search, but I was fairly certain someone else HAD to have run into this problem before, so I typed text file binary search in the Search box here, and got Binary Searches on Sorted Text Files.
runrig's reply in that thread pointed me to File::SortedSeek.
Module overview
File::SortedSeek implements binary searches through large sorted text files, using string, numeric, or timestamp keys.
It's ideal for finding a particular time in large logs, for instance.
The module was authored by Dr. James Freeman, better known around here as tachyon.
Usage example
The files I have to deal with use a non-standard integer timestamp. Each line looks like
{timestamp} {value} {value} {value} {value}
Using the module to find the right line couldn't be easier!
#!/usr/bin/perl -w use strict; use File::SortedSeek ':all'; my $targetTS=1234567789; # for instance open(FILE,"<data.in") or die "Can't open data.in, error $!"; # File::SortedSeek::numeric looks for a numeric key # It takes an optional sub ref argument to "massage" the # line from the file to extract the key. numeric(*FILE,$targetTS,sub {$_[0]=~/^\s*(\d+)/ or return 0; return $1 +}); # this will return the line that matches $targetTS, or the first line +> $line=<FILE>; close(FILE);
Conclusion
tachyon rules!!! :)
|
---|