что более эффективно: чтение из файла или выделение памяти - PullRequest
0 голосов
/ 05 мая 2018

У меня есть текстовый файл, и я должен выделить массив с таким количеством записей, как количество строк в файле. Что эффективнее: прочитать файл дважды (сначала узнать количество строк) и выделить массив один раз, или прочитать файл один раз, и использовать «realloc» после каждой прочитанной строки? заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Ответ «Что эффективнее / быстрее / лучше? ...» всегда таков:

Попробуйте каждый в системе, на которой вы собираетесь его использовать, точно измерьте свои результаты и выясните.

Термин "сравнительный анализ" .

Все остальное - предположение.

0 голосов
/ 06 мая 2018

Полагаю, вы хотите также сохранить строки чтения, а не просто выделить массив из такого количества записей.

Кроме того, вы не хотите изменять строки, а затем записывать их обратно, так как в этом случае вам лучше использовать 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 может быть немного дешевле.

Но вы должны это измерить, настройки вашей системы, размеры буфера и т. Д. Тоже будут влиять на ситуацию.

0 голосов
/ 05 мая 2018

Чтение файла дважды - плохая идея, независимо от эффективности. (Это также почти наверняка менее эффективно.)

Если ваше приложение настаивает на чтении его входного teice, это означает, что его входные данные должны перематываться, что исключает ввод с терминала и трубопроводов. Это ограничение настолько раздражает, что приложения, которые действительно должны читать свои вводные данные более одного раза (например, sort), обычно имеют логику для создания временной копии, если ввод невозможен.

В этом случае вы только пытаетесь избежать тривиальных издержек нескольких дополнительных вызовов malloc. Это не оправдывает ограничение параметров ввода приложения.

Если это недостаточно убедительно, представьте, что произойдет, если кто-то добавит файл между первым чтением и вторым. Если ваша реализация доверяет количеству, полученному при первом чтении, она переполнит вектор указателей строк при втором чтении, что приведет к неопределенному поведению и потенциальной уязвимости безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...