Некоторые подходы к эффективному чтению и записи больших объёмов данных в C++:
- Использование контейнеров с соотношением уникального ключа и значения. 2 Например, для больших данных можно построить
std::unordered_map
и стараться как можно реже его изменять. 2 - Минимизация затрат на динамическое выделение памяти на каждое поле в каждой записи. 2 Можно изначально выделить память под все данные всех полей в сумме. 2
- Обработка данных кусками, которые помещаются в оперативную память. 3 Нужно прочитать блок, обработать его, выкинуть исходные данные, затем прочитать следующий блок. 3
- Использование памяти, отображённой в файл. 14 Можно завести в памяти таблицу со смещениями строк и держать в памяти буфер на несколько тысяч строк. 4 При выходе за пределы буфера нужно переходить на нужное смещение файла и скачивать данные. 4
- Использование сжатых данных. 1 Можно записывать сжатые данные (например, с помощью zlib) и распаковывать их на лету. 1
- Применение асинхронной обработки. 5 Можно использовать методы асинхронного программирования, чтобы наиболее эффективно использовать ресурсы CPU во время ожидания завершения операций ввода-вывода. 5
Для эффективной обработки больших объёмов данных также может быть полезна параллельная обработка, для которой в C++ есть специальные фреймворки, например, OpenMP и Intel Threading Building Blocks (TBB). 5