Несколько 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-чанков вручную.
Возможно, стоит сопоставить файл и использовать несколько указателей, если файл достаточно мал (эквивалентно: ваше адресное пространство достаточно велико).