C# - Что, доступные структуры многомерных данных, которые работают хорошо?

Я должен сохранить многомерные данные, состоящие из чисел способом, с которым это легко работать. Я собираю данные в режиме реального времени (обрабатывающий живые видеокадры каждый 40ms/10ms) и когда-то обработал, я уничтожу и GC более старые данные.

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

То, каков мой выбор с точки зрения платформы, поддерживало структуры данных? Я использую VS 2010. и.NET 4.

1
задан Robinicks 28 May 2010 в 08:23
поделиться

3 ответа

Вероятно, самый быстрый способ:

  • Одномерный массив, индексированный как многомерный ( array [x, y] <=> array [x + y * columns] )
  • Доступ через указатели в случае случайного чтения / записи.
  • Используйте массив как можно чаще, не выделяйте новые постоянно. Особенно, если он большой, потому что, если размер> 85 КБ, он выделяется в куче больших объектов, которая не уплотняется сборщиком мусора после сбора, вызывая возможную фрагментацию, если вы постоянно перераспределяете массив.
  • Доступ по возможности параллельно. Просто нужно убедиться, что несколько потоков никогда не пишут в один и тот же элемент.

Конечно, это общий ответ, потому что вопрос также довольно общий. Хотя не могу ошибиться.

1
ответ дан 3 September 2019 в 00:15
поделиться

Как насчет простого многомерного массива? Это кажется очевидным и самым быстрым выбором.

0
ответ дан 3 September 2019 в 00:15
поделиться

В реальном времени или нет, создание объекта в .NET происходит довольно быстро, так что насчет ConcurrentQueue+ кортежей?

Таким образом, вы можете читать/писать потокобезопасно с довольно стандартными структурами данных. Следующий код занял 3 секунды на моем T500 в Visual Studio с включенной отладкой:

Stopwatch sw = Stopwatch.StartNew();
var q = new ConcurrentQueue<Tuple<int, int, int>>();
Enumerable.Range(0, 10000000).AsParallel().ForAll(i => q.Enqueue(Tuple.Create(i, i, i)));
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();

Забавно, но непараллельная версия еще быстрее.

1
ответ дан 3 September 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: