Apart from splitting up the file into some smaller files, you could simply open the file and seek it to something you may think of as close to the end of the file.
After that, you read as much lines as there may come, and, if you reach
EOF without all of your 10000000 desired lines, you just need to make a diff from the first position you guessed, and a new -- prior -- position, and try to read the n = diff lines.
I do not actually know if
tail does so, or if there's any available POSIX tool that performs this kind of operation; implementing this shouldn't take more than five minutes, I guess (:
This may be of some help.