Вы можете получить окончательный ответ только путем сканирования всего файла в поисках символов новой строки. Обойти это невозможно.
Однако есть пара возможностей, которые вы можете рассмотреть.
1 / Если вы используете упрощенный цикл, читая по одному символу за раз, проверяя наличие новых строк, не делайте этого. Несмотря на то, что ввод / вывод может быть буферизован, сами вызовы функций являются дорогостоящими с точки зрения времени.
Лучшим вариантом является чтение больших кусков файла (скажем, 5M) в память с помощью одной операции ввода-вывода, а затем обработка. Вам, вероятно, не нужно слишком беспокоиться о специальных инструкциях по сборке, так как библиотека времени выполнения C все равно будет оптимизирована - простой strchr()
должен сделать это.
2 / Если вы говорите, что общая длина строки составляет около 40-50 символов, и вам не нужно точное количество строк, просто возьмите размер файла и разделите на 45 (или что-то еще среднее значение, которое вы считаете нужным).
3 / Если это что-то вроде файла журнала и у вас нет , чтобы хранить его в одном файле (может потребоваться переделка в других частях системы), рассмотрите возможность периодического разбиения файла. 1016 *
Например, когда он достигает 5M, переместите его (например, x.log
) к датированному имени файла (например, x_20090101_1022.log
) и определите, сколько строк в этой точке (сохраняя в * 1020) *, затем запустите новый файл журнала x.log
Характеристики файлов журнала означают, что созданный датированный раздел никогда не изменится, поэтому вам никогда не придется пересчитывать количество строк.
Чтобы обработать «файл» журнала, вам нужно просто cat x_*.log
через некоторый канал процесса, а не cat x.log
. Чтобы получить количество строк в «файле», выполните wc -l
в текущем x.log (относительно быстро) и добавьте его к сумме всех значений в x_*.count
файлах.