Подтвердить что ты не робот

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

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

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

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

Есть ли что-нибудь подобное?

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

4b9b3361

Ответ 1

Позвольте мне предложить что-то совсем другое.

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

Вы считали СУБД?

Для небольших наборов данных все будет кэшироваться в памяти. По мере роста, СУБД будет иметь некоторые очень сложные методы кэширования/подкачки. Вы получаете полезные свойства, такие как сортировка/приоритизация, синхронизация/совместное использование бесплатно.

Действительно хорошо написанное пользовательское решение будет намного быстрее, чем СУБД, но будет иметь огромные затраты на разработку и обслуживание пользовательского решения. Потратьте немного времени на оптимизацию и настройку СУБД, и она начнет выглядеть довольно быстро и будет очень надежной.

Это может не соответствовать вашим потребностям, но я бы посоветовал долго смотреть на СУБД, прежде чем отклонять ее.

Ответ 2

Существует реализация с открытым исходным кодом контейнеров стандартной библиотеки шаблонов, созданных для решения именно этой проблемы.

STXXL почти прозрачно свопирует данные на диск для любого из стандартных контейнеров STL. Он очень хорошо написан и ухожен, и очень легко адаптировать/перенести ваш код, чтобы он схож с STL.

Другой вариант - использовать существующие контейнеры STL, но указать дисковый резервный диск. Все контейнеры STL имеют параметр шаблона для распределителя STL, который определяет способ хранения памяти для записей. Там хороший распределитель STL с поддержкой диска, который на кончике моего языка, но я не могу найти его через Google (я обновлю это, если/когда я это сделаю).

Изменить: я вижу, что Роджер уже упоминал об этом в комментариях.