"Richard Heyes" <richardh@xxxxxxxxxxx> wrote in message news:47F75D2A.3020101@xxxxxxxxxxxxxx >> Thanks for the heads up on fgetc() incrementing by one. I hadn't actually >> tested that code yet, I was using the original fseek($handle,$pos). >> >> strpos would be ideal but it needs to work on a string and not a file - I >> don't want to load a 100Mb file into memory if I don't have to. Perhaps I >> should test how quick the fgets() and ftell() method is because at least >> it loads in one line at a time. >> >> Does anybody know any other ways to go about the problem? > > Haven't read the rest of the thread, and so going by the subject alone, > fgets() finishes when it encounters a newline, so you can use this > wondrous fact to seek to a specific line: > > <?php > $fp = fopen('filename', 'r'); > $num = 18; // Desired line number > > for ($i=0; $i<$num; $i++) > $line = fgets($fp); > > echo $line; > ?> > > It works because fgets() stops when it encounters a newline (\n). So it's > just a case of counting the calls to fgets(). fgets() would work but as I'm constantly jumping around a 500,000 line file I thought it was better to maintain a cache of line number positions. As a final update to anybody following: - Taking away the unnecessary fseek() made the script execute in 63 seconds - Using a buffer system, (reading in 1Mb of the text file at a time and then looping through the string in memory) made the script execute in 36 seconds. Huge improvement, but... - Porting the code to C++, doing a shell_exec and reading the results back in to PHP, took less than 2 seconds. As fgetc() etc are all effectively C wrappers I was quite surprised at the speed increase.... Best wishes, Steve -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php