Вопрос

Я читаю файлы журналов, но не все строки хотят обрабатываться сразу.Я использую очередь/буфер для хранения строк, пока они ждут обработки.

Эта очередь регулярно сканируется на наличие определенных строк — при их обнаружении они удаляются из очереди (они могут находиться в ней где угодно).Если конкретная строка не найдена, строки по одной вынимаются из начала очереди для обработки.

Таким образом, очереди необходимо следующее:

  • Возможность изменения размера (или создания такого впечатления)
  • Удаление элементов откуда угодно
  • Добавлены элементы (всегда будут в конце очереди)
  • Быстро сканируйте
  • В зависимости от производительности имейте указатель того, куда он попал при последнем сканировании.

Первоначально я написал код, когда у меня было мало опыта работы с Java или API, и я просто использовал ArrayList, потому что знал, что он будет работать (не обязательно потому, что это был лучший вариант).

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

Спасибо

Это было полезно?

Решение

LinkedHashSet может представлять интерес.По сути, это HashSet, но он также поддерживает LinkedList, чтобы обеспечить предсказуемый порядок итераций, и поэтому его также можно использовать в качестве очереди FIFO с приятным дополнительным преимуществом, заключающимся в том, что он не может содержать повторяющиеся записи.

Поскольку это тоже HashSet, поиск (в отличие от сканирования) может быть O(1), если они могут совпадать. equals()

Другие советы

LinkedList, вероятно, будет наиболее подходящим.Он имеет все запрошенные свойства и позволяет удалять ссылки из середины за постоянное время, а не за линейное время, необходимое для ArrayList.

Если у вас есть определенная стратегия поиска следующего элемента, который нужно удалить, PriorityQueue или даже отсортированный набор могут оказаться более подходящими.

Быстрое сканирование обычно подразумевает какую-то реализацию на основе хэша, хорошей реализацией может быть ConcurrentSkipListMap.Log(n) для метода containskey, удаления и получения и сортируется так, чтобы с ним можно было связать какой-то приоритет.

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

Подумав об этом, я потенциально мог бы иметь:

HashMap<String,LinkedList<String>>

укажите идентификатор сеанса в качестве ключа и заполните LinkedList строками, принадлежащими сеансу.

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

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

Поскольку вам нужно удалять и добавлять элементы из набора, а также искать конкретные значения, возможно, лучшей структурой может быть что-то, реализующее SortedSet, например TreeSet.Этот класс гарантирует производительность log(n) для добавления, удаления и содержания.

Я предполагаю, что некоторые потоки будут писать в очередь, а другой — читать из нее.

В этом случае вам следует посмотреть очереди в пакете java.lang.concurrent.

Вы можете использовать PriorityBlockingQueue, чтобы он упорядочивал элементы для вас, или LinkedBlockingQueue, если вы хотите выполнить итерацию и самостоятельно выбрать элементы для удаления.

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

Гуава может помочь.

Проект Guava содержит несколько основных библиотек Google, которые мы используем в наших проектах на основе Java:коллекции, кэширование, поддержка примитивов, библиотеки параллелизма, общие аннотации, обработка строк, ввод-вывод и т. д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top