Схематический алгоритм:
1) читаешь кусок файла с конца (допустим, последние 100Кб)
2) разбиваешь с помощью split /\\r?\\n/ на строки
3) первую строку не трогаешь (вдруг это окончание большей строки?), остальному массиву делаешь reverse (или просто читаешь с конца с помощью отрицательных индексов).
4) читаешь следующие 100 Кб с конца + в конец прикрепляешь первую строку
5) и т.д. с пункта 2.
Само собой, нужна грамотная проверка на окончание цикла
Кажется, так.