Несколько ifstreams против ifstream + постоянный поиск

Я пишу внешний вид слияния. Это работает так: чтение k блоков из большого файла, сортировка их в памяти, выполнение k-way merge, готово. Поэтому мне нужно последовательно читать из разных частей файла во время фазы слияния k-way. Какой лучший способ сделать это: несколько ifstreams или один ifstream и поиск? Кроме того, есть ли библиотека для простого асинхронного ввода-вывода?

2 ответа

Использовать один ifstream за один раз в одном файле. Более одного тратят ресурсы, и вам все равно придется искать (потому что по умолчанию ifstreamуказатель файла начинается с начала файла).

Что касается асинхронной библиотеки ввода-вывода C++, проверьте этот вопрос.

РЕДАКТИРОВАТЬ: Я изначально неправильно понял, что вы пытаетесь сделать (эта статья в Википедии наполнила меня). Я не знаю сколько ifstream буферы по умолчанию, но вы можете отключить буферизацию, используя pubsetbuf(0, 0); метод, описанный здесь, а затем сделайте свою собственную буферизацию. Это может быть медленнее, чем использование нескольких ifstreamс автоматической буферизацией. Некоторый бенчмаркинг в порядке.

Обязательно попробуйте несколько потоков. Поиск, вероятно, отбрасывает внутренне буферизованные данные (по крайней мере, в процессе, даже если ОС хранит их в кеше), и если сортируемые элементы малы, это может быть очень дорого.

Во всяком случае, не должно быть слишком сложно сравнить эффективность ваших двух стратегий fstream. Проведите простой эксперимент с k = 2.

Обратите внимание, что может быть ограничение на количество одновременно открытых файлов, которое может иметь один процесс (ulimit -n). если вы достигнете этого, то вы можете рассмотреть возможность использования отдельного потока, но буферизацию данных из каждого из ваших k-чанков вручную.

Возможно, стоит сопоставить файл и использовать несколько указателей, если файл достаточно мал (эквивалентно: ваше адресное пространство достаточно велико).

Другие вопросы по тегам