Как я могу разделить большой массив данных между процессами без дублирования? (IP C) - PullRequest
0 голосов
/ 28 мая 2020

У меня есть процесс, который каждую секунду делает HTTP-запрос на получение некоторого API. Затем этот процесс выполняет какую-то работу со строкой JSON, возвращаемой из запроса. В то же время я хочу передать эту JSON строку другому процессу, чтобы сделать что-то еще.

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

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

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

Есть ли способ, которым я могу просто предоставить второму процессу доступ к массиву строк без дублирования строк или копирования? Я не могу использовать потоки, хотя потоки могут легко совместно использовать память, потому что процесс, выполняющий запросы REST, будет программой на C ++, а второй процесс будет программой Python.

1 Ответ

1 голос
/ 28 мая 2020

Взгляните на boost interprocess.

Вам необходимо создать файл с отображением памяти, который передается в boost.interprocess allocator. Этот распределитель занимает фрагменты файла, отображаемого в память. Затем их можно использовать, как если бы они были возвращены std :: allocator. С применением сопоставления, чтобы память была совместима с внутренней памятью c.

Контейнер boost.interprocess будет использовать память, возвращаемую распределителем. У него есть интерфейс типа std :: container.

Вам необходимо синхронизировать данные. Это делается с помощью некоторого межпроцессного мьютекса и должно использоваться для предотвращения состояний гонки за доступ к данным.

В качестве альтернативы, интерфейс передачи сообщений (MPI) - это метод связи между процессами. Обычно это делается для больших вычислений, таких как моделирование автомобилей sh и т.д. c.

Используя MPI, вы запускаете несколько процессов, которые обычно вычисляют одно и то же с разными входными данными.

MPI предлагает возможность создать MPI Window. С помощью этого окна вы можете записывать в память других MPI процессов.

Таким образом, ответ на ваш вопрос - утвердительный. Но это требует определенных затрат. Сценарий MPI требует запуска ваших процессов. Можно попасть в тупик, гонки данных, ...

...