Какие доступные многомерные структуры данных работают хорошо? - PullRequest
1 голос
/ 28 мая 2010

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

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

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

Ответы [ 3 ]

1 голос
/ 28 мая 2010

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

Таким образом, вы можете читать / писать поточно-ориентированные с довольно стандартными структурами данных. Следующий код занял 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 голос
/ 28 мая 2010

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

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

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

0 голосов
/ 28 мая 2010

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

...