Я пишу приложение на C ++, которое должно записывать большие файлы (до 100 ГБ) на диск SSD. Он работает на Windows 10. Я использую std :: fstream для записи в файл. Проблема заключается в том, что во время этого процесса резервная память Windows увеличивается до неоправданных размеров: она становится примерно равной объему данных, записываемых в настоящее время на диск, и накапливается вместе с ним. Когда этот объем достигает размера оперативной памяти компьютера (64 Гб), вся система начинает сильно отставать, что влияет на производительность. Скорость важна для приложения, поскольку оно получает исходные данные в режиме реального времени от аппаратного устройства. Стоит отметить, что данные фактически записываются в файл, поэтому нет необходимости (насколько я вижу) хранить их в оперативной памяти. Кроме того, потребление оперативной памяти приложения остается стабильным на уровне 25 Мб, поэтому, похоже, утечки памяти нет.
Если я использую во время процесса внешний инструмент, такой как EmptyStandbyList.exe, для очистки резервной памяти системы, то все работает гладко.
Если я закомментирую код записи файла, то память не будет накапливаться.
Антивирусное программное обеспечение отключено.
Эту ситуацию можно воспроизвести на следующем примере с игрушкой:
#include <iostream>
#include <memory>
#include <fstream>
static const size_t data_size = 1024 * 1024;
struct Packet
{
char data[data_size];
};
int main(int argc, char** argv)
{
uint64_t packet = 0;
std::ofstream out("buffer", std::ios_base::binary);
while (true)
{
std::shared_ptr<Packet> ptr = std::make_shared<Packet>();
out.write(ptr->data, data_size);
packet++;
if (packet % 1024 == 0)
{
std::cout << packet << std::endl;
}
}
}
(я использую Visual Studio 2013 Community Edition.)
Итак, вопрос: есть ли способ избежать накопления памяти?