Как эффективно сохранить текущее состояние изменяющихся данных из входных источников в C # с заданными критериями? - PullRequest
0 голосов
/ 04 июля 2019

Я работаю над проектом в WPF и .NET (4.7+) с некоторым ядром .NET (2.0+) и C ++ для некоторых библиотек конкретных проектов. (Среда: Windows 10 / 64bit, Visual Studio + Resharper и Jetbrains Rider для разработки).

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

Что я имею в виду под этим:

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

  2. Унифицировано - хотя данные имеют контекст (т. Е. Кадр видео, область экрана, завершенная полезная нагрузка сетевых пакетов), фактические данные представляют собой просто простую структуру байтов, и они до контекстно-зависимых читателей и писателей беспокоиться о том, как использовать данные. Источник данных может варьироваться от видео до веб-камеры, повторяя цикл снимков экрана, даже копии областей, которые другие обрабатывают читаемой памятью.

  3. Generic - кроссплатформенность является целью, поэтому .NET Framework привязан к окнам, ядро ​​.NET, вероятно, является лучшим (самым простым) решением, а решение C ++ будет еще лучше (полностью отойдя от CLR, но все же с возможностью использования в качестве неуправляемой библиотеки). Тем не менее, ядро ​​.NET, вероятно, является предпочтительным маршрутом. Здесь я говорю только о самом управлении данными (наиболее эффективный способ перевода непрерывно изменяющихся данных в некий читаемый объект хранения текущего состояния, приложение, платформы и библиотеки, которые управляют обработкой данных, не является частью этого вопроса .

Один конкретный пример проблемы, которую я хотел бы решить с помощью этого:

В настоящее время я работал только с решениями GDI + (System.Drawing.Graphics.CopyFromScreen / внутренне использует bitblt) для скриншотов областей экрана, которые копируют данные пикселей в растровое изображение. Хотя это очень быстрое копирование с экрана на растровое изображение (и, возможно, из-за того, что я копаю глубже), факт заключается в том, что я копирую весь регион, и я хотел бы попытаться оптимизировать его ТОЛЬКО для пикселей, которые изменились (и да, я посмотрел на параметр «CopyPixelOperation», но ни одна из доступных настроек не помогла). Я чувствую, что может быть более оптимизированный способ справиться с этим. Я думаю о чем-то вроде реализации, похожей на INotifyPropertyChanged (bindings) в WPF:

private int intValue;
public int IntValue {
    get => intValue;
    set {
        if(intValue == value) return; // do nothing it didn't change
        intValue = value;
        OnNotifyPropertyChanged(nameof(IntValue));       
    }
}

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

В любой момент (моментальные снимки) обновленные данные в режиме реального времени могут быть получены другой системой (интерпретатором / обработчиком AI или ML).

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

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

Конечная цель состоит в том, чтобы гарантировать, что точное состояние данных (или область), обновляемая живым потоком (входным источником) в любой момент времени, может быть получено интерпретатором ai / ml, оптимизированным для быстрого считывания возможный. Кроме того, фактическая скорость / оптимизация интерпретации данных с помощью этой системы машинного обучения или искусственного интеллекта (или любого другого процесса, использующего ее) является чем-то за рамками этого вопроса).

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

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

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

...