Некоторые подходы к эффективному чтению и записи больших объёмов данных в C++:
- Использование контейнеров с соотношением уникального ключа и значения. xakep.ru Например, для больших данных можно построить
std::unordered_map
и стараться как можно реже его изменять. xakep.ru - Минимизация затрат на динамическое выделение памяти на каждое поле в каждой записи. xakep.ru Можно изначально выделить память под все данные всех полей в сумме. xakep.ru
- Обработка данных кусками, которые помещаются в оперативную память. otvet.mail.ru Нужно прочитать блок, обработать его, выкинуть исходные данные, затем прочитать следующий блок. otvet.mail.ru
- Использование памяти, отображённой в файл. stackoverflow.com www.rsdn.org Можно завести в памяти таблицу со смещениями строк и держать в памяти буфер на несколько тысяч строк. www.rsdn.org При выходе за пределы буфера нужно переходить на нужное смещение файла и скачивать данные. www.rsdn.org
- Использование сжатых данных. stackoverflow.com Можно записывать сжатые данные (например, с помощью zlib) и распаковывать их на лету. stackoverflow.com
- Применение асинхронной обработки. www.codewithc.com Можно использовать методы асинхронного программирования, чтобы наиболее эффективно использовать ресурсы CPU во время ожидания завершения операций ввода-вывода. www.codewithc.com
Для эффективной обработки больших объёмов данных также может быть полезна параллельная обработка, для которой в C++ есть специальные фреймворки, например, OpenMP и Intel Threading Building Blocks (TBB). www.codewithc.com