Разрабатываемое мной приложение связывается с цифровым аудиоустройством, которое способно отправлять 24 различных голосовых потока одновременно.
Устройство подключено через USB, используя устройство FTDI (эмулятор последовательного порта) и драйверы D2XX (основной драйвер COM должен замедлять обработку 4,5 Мбит).
В основном приложение состоит из 3 потоков:
Основной поток - GUI, контроль, т. Д.
Bus reader - в этом потоке данные постоянно считываются с устройства и сохраняются в файловом буфере (в этом потоке нет логики)
Интерпретатор данных - этот поток считывает данные из файлового буфера, конвертирует их в сэмплы, выполняет простую обработку сэмплов и сохраняет сэмплы в отдельные файлы WAV.
Причина, по которой я использовал файловый буфер, заключается в том, что я хотел быть уверен, что не потеряю ни одного семпла. Приложение не использует запись все время, поэтому я выбрал это решение, потому что оно было безопасным.
Приложение работает нормально, за исключением того, что генератор буферных волновых файлов работает довольно медленно. Для 24 параллельных записей продолжительностью 1 минута требуется около 4 минут для завершения записи. Я уверен, что исключение использования жесткого диска в этом процессе значительно увеличит скорость.
Вторая проблема заключается в том, что файловый буфер действительно тяжел для длинных записей, и я не могу это очистить
до конца обработки данных (это еще больше замедлит процесс).
Для буфера ОЗУ мне нужно по крайней мере 1 ГБ, чтобы он работал правильно
Каков наилучший способ выделить такой большой объем памяти в .NET? Я собираюсь использовать эту память в двух потоках, поэтому нужен быстрый механизм синхронизации. Я думаю о буфере цикла: один большой массив, Bus Reader сохраняет данные, Data Interpreter читает их. Что вы думаете об этом?
[править]
Теперь для буферизации я использую классы BinaryReader и BinaryWriter на основе файла.