2012-02-23 7 views
1

У меня есть приложение, которое будет считывать последовательные пакеты из соединения udp. Эти сообщения должны храниться в виде буфера с их порядковыми номерами для поиска.Обработка последовательных сетевых пакетов

Этот «буфер» обслуживается другим потоком, который удаляет сообщение и обрабатывает его. Если номер последовательности пропущен, я остановлю поток службы, а затем повторно запрошу сообщение в другом TCP-соединении. Как только он прибывает, я хочу перебросить его обратно в буфер, и поток обслуживания может продолжаться.

Так что мне нужно: вставки по клавишам, удаление по самой низкой клавише. Ключ будет числовым числовым числом, таким как 1,2,3,4, поэтому он немного легче отслеживает наибольшее число, так как ключ может, таким образом, увеличиваться/уменьшаться, избегая необходимости сортировки структуры данных.

My one plan is to use a Dictionary as the buffer, which makes for a simple solution

My other solution uses a set up two queues

Suggestion by zmbg to use SortedList - I am concerned about performance, as hashing would provide faster lookup and insert not?

Мои вопросы:

  • В основном я ищу ловушках с точки зрения памяти или производительности с использованием словаря для этого решение. Аппарат, который будет запускать его, не имеет слишком большой памяти, но пропускная способность имеет несколько более высокий приоритет.
  • Если это приложение работает весь день, будут ли возникать проблемы с памятью при использовании словаря?
  • У кого-нибудь есть мысли по поводу этой или альтернативной реализации этой процедуры. Я должен принять решение о дизайне, но я не могу тестировать различные решения для производительности, поскольку у меня недостаточно времени, поэтому я решил попробовать теоретический сбор идей и достоинств идей внедрения до того, как я начну.
+0

У вас действительно есть служба, которая использует * оба * UDP и TCP? Это звучит странно. Почему бы вам просто не использовать TCP в первую очередь, если вам нужны все пакеты, и вы нуждаетесь в них по порядку? – svick

+0

Также вы используете .Net 4.0? – svick

+0

@svick Я использую .Net 2.0, но если решение требует .Net 4.0, я могу посмотреть, возможно, обновить соответствие всего кода .Net 4.0. – Vort3x

ответ

0

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

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

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

1

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

В словаре нет понятия «первый».

Потребление памяти будет более или менее одинаковым (данные будут занимать большую часть памяти, а не накладные расходы на словарь или список), а производительность списка будет лучше.

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

Список .NET фактически реализован по массиву, который не является лучшим выбором, но вы можете использовать LinkedList - это идеально подходит для того, что вам нужно.

+0

Почему список не будет достаточным, если будет много потери пакетов? – Vort3x

+0

Это зависит от того, как вы используете Список. Если вы использовали что-то вроде 'List.RemoveAt (0)', то это имеет плохую производительность для больших списков. С другой стороны, реализация кругового буфера должна быть довольно быстрой. В любом случае производительность, вероятно, не имеет большого значения, поскольку список не будет содержать много элементов. – svick

+0

Добавление вещей в середину списка может быть неэффективным, но на самом деле вам это не нужно. Я отредактирую сообщение. – zmbq

Смежные вопросы