From: Richard Lee <[EMAIL PROTECTED]>
> Mr. Shawn H. Corey wrote:
> > It still has to go through the entire file and mark the offsets to the
> > start of every line.
> >
> > The best way to do this is just to bite the bullet and do it.
> 
> There is no way to read say last 10 MB of the file or something? It's 
> very surprising why no such thing exists..

It's a very different thing to read the last 10MB and to read the 
last 100000 lines. You know how many bytes are 10MB so you can seek() 
just to that position easily, you don't know (unless the lines are of 
the same and known length) how many bytes are 100000 lines. So if 
you'd really need to process the last 100000 lines in order, you'd 
first have to find the 100000th newline character counting from the 
end ... that is seek() say 1MB before the end, read 1MB, count the 
newlines, seek additional 1MB, read 1MB, count the newlines and 
repeat this till you find the chunk containing the 100000th newline, 
then find its position, seek() to that position (keep in mind that 
you have to read the file as binary, if you let Perl convert newlines 
or something like that, then the positions will not match!) and start 
reading.

Any chance you instead want to start reading where you left off last 
time? In that case you want to remember the position in the file 
using tell() whenever you finish processing it, store it somewhere 
and next time start by seek()ing to that position.

Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to