Полагаю, вы хотите также сохранить строки чтения, а не просто выделить массив из такого количества записей.
Кроме того, вы не хотите изменять строки, а затем записывать их обратно, так как в этом случае вам лучше использовать mmap.
Чтение файла дважды всегда плохо, даже если он кэшируется во второй раз, требуется слишком много системных вызовов. Также выделение каждой строки отдельно, если это пустая трата времени, если вам не нужно освобождать их в случайном порядке.
Instead read the entire file at once, into an allocated area.
Find the number of lines by finding line feeds.
Alloc an array
Put the start pointers into the array by finding the same line feeds again.
If you need it as strings, then replace the line feed with \0
Это также может быть улучшено на современных процессорных архитектурах, вместо того, чтобы читать массив дважды, это может быть быстрее, просто выделяя «достаточно большой» массив для указателя и сканируя массив один раз. Это приведет к тому, что realloc в конце будет иметь правильный размер и, возможно, пару раз, чтобы увеличить массив, если он не был достаточно большим в начале.
Почему это быстрее? потому что у вас много if
, которые могут занять много времени для каждой строки. Так что лучше сделать это только один раз, стоимость - это перераспределение, но копирование больших массивов с помощью memcpy может быть немного дешевле.
Но вы должны это измерить, настройки вашей системы, размеры буфера и т. Д. Тоже будут влиять на ситуацию.