Как читать и записывать данные на очень высокой скорости в C ++? - PullRequest
0 голосов
/ 12 марта 2012

Мне нужно читать данные с платы, которая генерирует данные с очень высокой скоростью. Я должен быстро прочитать эти данные, разобрать их и записать в другой файл. Поскольку операция чтения выполняется с очень высокой скоростью, я должен реализовать два потока в C ++. Так что один поток читает, а другой записывает данные в файл. Поскольку буфер чтения и записи одинаков, механизмы блокировки использовать нельзя. Реализация с использованием кольцевого буфера не является хорошим решением. Любая другая идея реализовать это в C ++, которая не уменьшает скорость чтения?

Ответы [ 4 ]

1 голос
/ 12 марта 2012

Карта обоих файлов в памяти. Используйте большие буферы чтения и записи с размером, кратным размеру страницы. Используйте асинхронную запись в память в новом файле. Запустите обе темы: одну для чтения, а другую для записи. Установите коммуникационное сообщение между обоими потоками, чтобы при чтении новой части файла сообщать о своей доступности второму потоку. Тем временем вы читаете новую часть файла во втором буфере, поток разбора и записи может работать с его буфером. Когда вы закончите эту операцию синтаксического анализа и записи, передайте ее первому потоку для повторного использования этого буфера.

1 голос
/ 12 марта 2012

Обычно лучше всего позволить ОС справиться со всеми оптимизациями.Поэтому я бы использовал какой-нибудь инструмент mmap - либо системный вызов mmap (2) в Linux / Unix, либо MemoryMapOfFile в Win32.

То, что это делает, инструктирует ОС обрабатывать файл как область памяти, используя обычную подсистему виртуальной памяти.Это означает, что система управляет буферизацией глобально оптимальным образом и обычно считается несколько оптимальной.

Это хорошая пища для размышлений:

https://www.varnish -cache.org /ПРОФ / вики / ArchitectNotes

0 голосов
/ 12 марта 2012

Я бы предложил использовать условную переменную , чтобы указать автору записи, что для него есть готовый буфер. Также удобно помещать ссылку на буфер в очередь, чтобы модуль записи мог обрабатывать несколько буферов.
Обратите внимание, что если данные поступают быстрее, чем их можно обработать, в какой-то момент произойдет перегрузка.

0 голосов
/ 12 марта 2012

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

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