Резервное накопление памяти в Windows при записи в файл - PullRequest
0 голосов
/ 05 мая 2018

Я пишу приложение на 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.)

Итак, вопрос: есть ли способ избежать накопления памяти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...