Это действительно зависит от вашей системы.Современная система обычно читает вперед;поиск в файле, вероятно, будет препятствовать этому, поэтому его следует избегать.
Возможно, стоит поэкспериментировать, как в вашей системе работает упреждающее чтение: откройте файл, затем последовательно прочитайте его первую половину и посмотрите, сколько времени это займет.Затем откройте его, найдите середину и последовательно прочитайте вторую половину.(В некоторых системах, которые я видел в прошлом, простой поиск в любой момент отключит опережающее чтение.) Наконец, откройте его, а затем прочитайте все остальные записи;это симулирует два потока, используя один и тот же дескриптор файла.(Для всех этих тестов используйте записи фиксированной длины и открывайте их в двоичном режиме. Также примите все необходимые меры, чтобы убедиться, что любые данные из файла удаляются из кэша ОС перед началом теста - в Unix, копируя файлДля этого обычно достаточно 10 или 20 Гигабайт до /dev/null
.
Это даст вам некоторые идеи, но, чтобы быть уверенным, лучшим решением было бы проверить реальные случаи. Я был бы удивлен, еслиобщий доступ к одному ifstream
(и, следовательно, одному дескриптору файла) и постоянный поиск выиграл, но вы никогда не знаете.
Я бы также порекомендовал системные решения, такие как mmap
, но если выИмея столько данных, есть большая вероятность, что вы все равно не сможете отобразить все это за один раз (вы все равно можете использовать mmap
, отображая их разделы за раз, но это становится намного сложнее).
Наконец, возможно ли будет вырезать данные, уже разрезанные на более мелкие файлы? Это может быть самым быстрым решением из всех. (В идеале это можно было бы сделать, еслиДанные создаются или импортируются в систему.)