Если это не фиксированный рекорд длины файла и не делать какие-то индексации на линии начинается, лучше всего будет просто использовать:
head -n N filespec | tail -1
где N
номер строки вы хотите.
Это, к сожалению, не самый эффективный фрагмент кода для файла 3Gb, но есть способы сделать его лучше.
Если файл не изменяется слишком часто, вы можете захотеть его проиндексировать. Под этим я имею в виду наличие другого файла с смещениями строки в нем как фиксированные записи длины.
Так файл:
0000000000
0000000017
0000000092
0000001023
даст вам быстрый способ найти каждую строку. Просто умножьте желаемый номер строки на размер записи индекса и найдите там в индексном файле.
Затем используйте значение в этом месте для поиска в основном файле, чтобы вы могли читать до следующего символа новой строки.
Итак, для строки 3 вы должны искать в индексном файле 33 (длина индексной записи - 10 символов плюс еще одна для новой строки). Чтение значения там, 0000000092
, даст вам смещение для использования в основной файл.
Конечно, это не так полезно, если файл изменяется часто, хотя, если вы можете контролировать, что происходит, когда что-то добавляется, вы все равно можете добавить смещения к индексу эффективно. Если вы не должны, то вам нужно будет повторно индексировать всякий раз, когда дата последнего изменения индекса будет раньше, чем дата основного файла.
И, основываясь на вашем обновлении:
Update: Если это имеет значение, все строки имеют одинаковую длину.
С помощью этой дополнительной информации вам не нужен указатель - вы можете просто сразу же найти нужное место в главном файле, умножив длину записи на длину записи (при условии, что значения соответствуют вашим значениям типы данных).
Так что-то вроде псевдокода:
def getline(fhandle,reclen,recnum):
seek to position reclen*recnum for file fhandle.
read reclen characters into buffer.
return buffer.
+1. В основном то же самое, что и мое более позднее решение после добавления фрагмента фиксированного размера записи в вопрос, но имеет явное преимущество в том, что вам не нужно писать свою собственную программу. – paxdiablo
Это так дерзко. Хех. dd, мне это нравится. – JavaRocky