c:\test>perl -e"printf qq[Line %010d\n], $_ for 1 .. 25" > junk.dat c:\test>type junk.dat Line 0000000001 Line 0000000002 Line 0000000003 Line 0000000004 Line 0000000005 Line 0000000006 Line 0000000007 Line 0000000008 Line 0000000009 Line 0000000010 Line 0000000011 Line 0000000012 Line 0000000013 Line 0000000014 Line 0000000015 Line 0000000016 Line 0000000017 Line 0000000018 Line 0000000019 Line 0000000020 Line 0000000021 Line 0000000022 Line 0000000023 Line 0000000024 Line 0000000025 #### c:\test>type indexFile.pl #! perl -sw use strict; open INDEX, '>:raw', "$ARGV[ 0 ].idx" or die $!; syswrite INDEX, pack( 'N', 0 ), 4; syswrite INDEX, pack( 'N', tell *ARGV ), 4 while <>; close INDEX; c:\test>indexFile junk.dat c:\test>dir junk.dat* 21/12/2011 17:45 425 junk.dat 21/12/2011 17:46 104 junk.dat.idx c:\test> #### c:\test>type readIndexedFile.pl #! perl -sw use strict; use Time::HiRes qw[ time ]; our $N //= 100; open INDEX, '<:raw', "$ARGV[ 0 ].idx" or die $!; my $len = -s( INDEX ); sysread INDEX, my( $idx ), $len; close INDEX; sub getRecordN { my( $fh, $n ) = @_; seek $fh, unpack( 'N', substr $idx, ($n-1) * 4, 4 ), 0; return scalar <$fh>; } open DAT, '<', $ARGV[ 0 ] or die $!; for my $line ( 1 .. ( length( $idx ) / 4 ) - 1 ) { print "Expecting $line; got: ", getRecordN( *DAT, $line ); } c:\test>readIndexedFile junk.dat Expecting 1; got: Line 0000000001 Expecting 2; got: Line 0000000002 Expecting 3; got: Line 0000000003 Expecting 4; got: Line 0000000004 Expecting 5; got: Line 0000000005 Expecting 6; got: Line 0000000006 Expecting 7; got: Line 0000000007 Expecting 8; got: Line 0000000008 Expecting 9; got: Line 0000000009 Expecting 10; got: Line 0000000010 Expecting 11; got: Line 0000000011 Expecting 12; got: Line 0000000012 Expecting 13; got: Line 0000000013 Expecting 14; got: Line 0000000014 Expecting 15; got: Line 0000000015 Expecting 16; got: Line 0000000016 Expecting 17; got: Line 0000000017 Expecting 18; got: Line 0000000018 Expecting 19; got: Line 0000000019 Expecting 20; got: Line 0000000020 Expecting 21; got: Line 0000000021 Expecting 22; got: Line 0000000022 Expecting 23; got: Line 0000000023 Expecting 24; got: Line 0000000024 Expecting 25; got: Line 0000000025