Это действительно зависит от вашего определения «эффективный».
Если вы имеете в виду эффективность с точки зрения памяти, вы можете использовать устройство чтения потока, так что у вас есть только одна строка текста в памяти за раз, к сожалению, это происходит медленнее, чем загрузка всего объекта за один раз и может заблокировать файл.
Если вы имеете в виду в кратчайшие сроки, то это задача, которая принесет большие выгоды от параллельной архитектуры. Разделите файл на куски и передайте каждый кусок в другой поток для обработки. Конечно, это не особенно эффективный процессор, так как он может использовать все ваши ядра на высоком уровне использования.
Если вы хотите просто выполнить минимальное количество работ, есть ли что-нибудь, что вы уже знаете о файле? Как часто он будет обновляться? Являются ли первые 10 символов каждой строки одинаковыми? Если вы просмотрели 100 строк в последний раз, вам нужно снова просмотреть эти строки? Любой из них может создать огромную экономию как для использования времени, так и для памяти.
В конце дня, хотя нет волшебной пули, и для поиска файла (в худшем случае) используется операция O (n).
К сожалению, просто перечитать, что и он может встретить как саркастический, и я не имею в виду, что это будет. Я просто хотел подчеркнуть, что любые выигрыши, которые вы делаете в одной области, скорее всего, будут терять в другом месте, а «эффективный» - очень двусмысленный термин в подобных обстоятельствах.
Хорошая идея. Мы делаем это в одном проекте, и все же я все еще забываю об этом. –
Очень приятно! Я думаю, что, вероятно, буду использовать этот подход. –
не забывайте кэшировать предыдущий результат, вместо того, чтобы повторно сканировать файл, начните поиск там, где вы ожидали, что строка будет работать и работать оттуда. Я предполагаю, что это будет работать, только если ваш файл не изменится так много с каждой итерацией. Однако это должно сэкономить немного времени. –