Actually, a compromise suggestion might not be so bad ... Since the file is
sorted, one would only need to read the file sequentially once, and note the binary
seek() position where each sequence begins.
(It ends where the next one begins.) You might even be able to keep that data in memory. Or, write it to a separate file that each script loads. Each script could now seek directly to the right spot, read the specified number of bytes, and do a couple of quick debugging-checks to make sure that what it just read looks okay.
(i.e. that the index-file is not out of date.) Simple and easy to do, and it just might save a lot of time. (If the region is very-large, consider also
File::Map.)