Если файл слишком большой, чтобы вписаться в системную память, и у вас есть много потоков, которые должны прочитать весь файл, есть хорошая вероятность, что ваше приложение будет ограничено дисковым вводом-выводом. независимо от того, как вы читаете файл, и как бы ни была умна ОС.
Если это неприемлемо, вам потребуется создать альтернативную архитектуру для вашего приложения. Например, вы можете преобразовать файл в другую форму, которая позволяет потокам извлекать необходимую информацию без чтения всего файла. Или вы можете превратить приложение в отдельные процессы, запущенные на отдельных машинах, каждый со своей собственной копией файла. Третьей возможностью было бы добавить поток, единственной целью которого является чтение и буферизация файла, а также наличие существующих потоков, считанных из буферов. (Благодаря тому, что рабочие потоки работают в одном и том же регионе файла, вы избегаете необходимости чтения частей файла с диска несколько раз. Если приложение действительно связано с дисками, это может ускорить его.)
Однако все это догадка. Трудно дать достойный совет без дополнительной информации о приложении и файле, который он обрабатывает.
EDIT: на основе ваших последующих комментариев кажется, что нити не нуждаются во всех файлах. Мое первое предложение спорно (вы все готовы делать это!), И мое третье предложение не поможет. Я предлагаю вам сделать так, как @Jon Skeet говорит и реализует систему простым способом. Затем, если есть проблемы с производительностью, найдите способы сделать это быстрее/лучше. Например:
- Рассмотрите возможность использования кэша в памяти последних запросов и их результатов.
- Рассмотрите возможность использования нескольких машин и разбиение индексного файла на диапазон ключевых слов, чтобы каждая часть поместилась в память на одной машине.
- Если вы поддерживаете сложные запросы, рассмотрите их разделение на простые и отправьте простые запросы на разные машины (например, на основе разбиения на ключевые слова), а затем объедините результирующие наборы.
- Рассмотрите способы избежать вычисления огромных наборов результатов, когда пользователь только хочет посмотреть на первые несколько результатов.
Я заимствовал интересный учебник по индексированию от коллеги пару лет назад. Я думаю, что это было Managing Gigabytes by Witten et al.
я сказал что-то не так, когда я спрашиваю. Чтение файла не нужно читать весь файл каждый раз. Он должен каждый раз читать одну или несколько частей файла. Я хранил смещение каждой части заранее. –