Обработка последовательных сетевых пакетов - PullRequest
1 голос
/ 23 февраля 2012

У меня есть приложение, которое будет читать последовательные пакеты из соединения 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?

Мои вопросы:

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

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

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

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

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

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

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

0 голосов
/ 10 марта 2012

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

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

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

...