Я написал прогу C ++ для запроса словаря 100 ГБ. Я разделил словарь на n файлов одинакового размера. Все сплит-файлы размещены в одном каталоге. Словарь полностью проиндексирован, то есть, когда приходит запрос, я знаю, какой spit-файл открыть и где искать. Мой вопрос — для лучшей производительности, какой раскол будет лучше:
(а) небольшое количество больших файлов или (б) большое количество маленьких файлов?
Кроме того, что было бы идеальным разделением?
Я не думаю, что есть прямой ответ на этот вопрос. только эксперимент может сказать вам. Стоимость открытия файла для чтения должна быть постоянной независимо от размера, тогда чтение содержимого файла, конечно, зависит от размера файла.
Есть и другие подсказки, хотя
Я предполагаю, что когда вы получаете запрос, вы открываете файл, анализируете / читаете его полностью или до тех пор, пока не найдете слово, затем закроете файл и вернете результат, в этом случае нужно сделать много улучшений, возможно, они у вас есть, возможно нет, но здесь идет
проверять когда файл загружается в память
Совершенно другой подход будет использовать базу данных с индексом. эта проблема вам не нужно иметь дело с проблемами открытия файлов
Ваш словарь статичен или может измениться во время выполнения?
Если это статично, используйте один файл для всего.
Если он динамический и ваши индексы являются «векторами» (не лучшая идея), используйте файл для данных и один файл для каждого индекса.
Если он динамический и ваши индексы являются «деревьями» (включая декы и другие векторные, такие как ADT, которые не являются непрерывными на 100%), вы можете снова использовать один файл, если только для скорости не имеет смысла хранить индексы на отдельных томах.
Вы должны открыть файл в начале и никогда больше не подвергаться штрафам за открытие / закрытие файла.
Если ваше приложение 64-битное, просто отобразите весь файл в памяти и позвольте ОС сделать все остальное.
Если ваше приложение 32-разрядное, по-прежнему используйте отображение памяти для доступа к файлу. Вам нужно будет создать «окно» с отображением в памяти для каждого возможного параллельного доступа, который вам может понадобиться (для статических данных, вероятно, по одному на поток в данных, по одному или два на поток в каждом индексе).