Как можно освободить место в куче, используемое структурами STD для других процессов? - PullRequest
1 голос
/ 05 февраля 2020

В настоящее время я пишу пользовательский загрузчик данных PyTorch, который загружает данные обучения для машинного обучения из файла размером 2 ГБ JSON.

Загрузчик данных, который в основном представляет собой модуль расширения CPython, написанный на C ++, загружает весь файл JSON во временную структуру данных и преобразует данные в другой формат в памяти, совместимый с используемой моделью PyTorch.

Мне удалось создать программу загружать и преобразовывать данные с разумной скоростью благодаря великолепным свободным библиотекам, но оказалось, что программа потребляет слишком много памяти, когда я пытался увеличить объем обучения.

Когда PyTorch выполняет многопроцессорную работу / многоузловое обучение, библиотека выделяет один процесс Python для каждого графического процессора, что означает, что одновременно работает несколько отдельных экземпляров загрузчика данных.

На моей машине достаточно ОЗУ для запуска одного загрузчика данных без проблем, но недостаточно оперативной памяти для запуска нескольких из них.

Я мог бы подтвердить, что, как только пространство ОЗУ будет исчерпано, загрузчики данных начнут использовать несколько ГБ пространства подкачки, и это сильно ухудшит производительность.

Так что я начал видеть, где я могу сохранить Некоторое пространство ОЗУ в моем загрузчике данных.

Я обнаружил, что временная структура данных, в которую первоначально загружаются данные JSON, совершенно не нужна после завершения преобразования, поэтому я хочу освободить это пространство памяти для другие процессы.

Вопрос в том, как мне это сделать со стандартной библиотекой? Структура данных в основном состоит из std::vector s и std::unordered_map s в куче, но простое их уничтожение не освобождает пространство памяти, поскольку в Linux glib c не реализован механизм сжатия кучи.

На Windows Я мог бы реализовать пользовательский std::allocator, который находится в отдельной куче, и просто уничтожить всю кучу после использования (хотя я не уверен, что это на самом деле работает), но glib c malloc() делает не принимать параметр дескриптора кучи.

Я не верю, что этот вопрос задают впервые, и я также не думаю, что реализация пользовательского std::allocator на основе стороннего распределителя кучи единственный ответ. Как можно освободить место в куче для другого процесса, в Linux glib c? Не могли бы вы дать мне указатели?

Заранее спасибо.

...