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

Я использую c/c++/cuda менее недели и не знаком со всеми вариантами, доступными с точки зрения библиотек (извините, если мой вопрос слишком дурацкий или невозможный ). Вот моя проблема: у меня есть процесс, который берет данные и анализирует их, а затем выполняет 1 из 3 действий: (1) сохраняет результаты, (2) отбрасывает результаты или (3) разбивает данные и отправляет их обратно для обработки.

Часто вариант (3) создает много данных, и я очень быстро превышаю доступную мне память (мой сервер составляет 16 гигабайт), поэтому я решил настроить сервер очередей (rabbitmq), который я отправлял и получать работу от (он меняет очередь, когда достигает определенного размера памяти). Это отлично работало, когда я использовал небольшие серверы с более быстрыми сетевыми интерфейсами для передачи данных, но в последнее время я изучал и преобразовывал свой код с Java на c/c++ и запускал его на графическом процессоре, что сделало очереди большим узким местом. Узким местом, очевидно, был сетевой ввод-вывод (профилирование на дешевых системах показало высокую загрузку процессора и аналогично старым графическим процессорам, но новые более быстрые процессоры / графические процессоры не используются так сильно, а сетевой ввод-вывод стабилен на уровне 300-400 / Мб).Поэтому я решил попытаться полностью исключить сеть и запустить сервер очередей локально на сервере, что сделало его быстрее, но я подозреваю, что это могло бы быть еще быстрее, если бы я использовал решение, которое не полагалось на внешние сетевые службы (даже если я запускаю их локально). Это может не сработать, но я хочу поэкспериментировать.

Итак, мой вопрос: есть ли что-нибудь, что я могу использовать, например очередь, из которой я могу удалять записи по мере их чтения, а также перемещать очередь на диск, как только она достигает определенного размера (но сохраняет очередь в памяти всегда полной? так что мне не нужно ждать, чтобы прочитать с диска)? При изучении Cuda есть много примеров исследователей, проводящих анализ огромных наборов данных, любых идей о том, как они обеспечивают поступление данных с максимальной скоростью для обработки системой (я полагаю, что они не привязаны к диску/сети, в противном случае более быстрые графические процессоры на самом деле не даст им значительного увеличения производительности)?

Существует ли что-нибудь подобное?

п.с. если это поможет, до сих пор я экспериментировал с rabbitmq (слишком медленно для моей ситуации), apollo mq (хорошо, но все еще основано на сети), reddis (очень понравилось, но не может превышать физическую память), играл с mmap(), и я я также сжал мои данные, чтобы повысить пропускную способность. Я знаю общие решения, но мне интересно, есть ли что-то родное для c/c++, cuda или библиотеки, которую я могу использовать (в идеале, у меня была бы очередь в глобальной памяти Cuda, которая переключалась бы на память хоста, которая переключалась на диск, чтобы GPU всегда работали на полной скорости, но это, возможно, принятие желаемого за действительное).Если есть что-то еще, о чем вы можете подумать, дайте мне знать, и я с удовольствием поэкспериментирую с этим (если это поможет, я разрабатываю на Mac и запускаю его на Linux).

16
задан Lostsoul 12 May 2012 в 23:40
поделиться