Реализация файловой очереди - PullRequest
12 голосов
/ 01 июля 2010

У меня есть очередь в памяти, в которой несколько потоков помещают в очередь объекты.Обычно очередь должна очищаться одним потоком чтения, который обрабатывает элементы в очереди.

Однако существует вероятность того, что очередь заполнена.В таком случае я хотел бы сохранить любые дополнительные элементы на диске, которые были бы обработаны другим потоком фонового чтения, который сканирует каталог для таких файлов и обрабатывает записи в файлах.Я знаком с Active MQ, но предпочитаю более легкое решение.Это нормально, если «FIFO» строго не соблюдается (поскольку сохраненные записи могут быть обработаны не по порядку).

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

Спасибо!

Ответы [ 7 ]

6 голосов
/ 28 января 2014

Взгляните на http://square.github.io/tape/, и его впечатляющий файл QueueFile.

(спасибо Брайану МакКаллистеру "Сокровище длинных хвостов" за указание на это).

4 голосов
/ 01 июля 2010

Вы можете использовать что-то вроде SQLLite для хранения объектов.

3 голосов
/ 01 июля 2010

EHCache может переполниться на диск. Это также в высокой степени одновременно, хотя вам действительно не нужно это

1 голос
/ 03 апреля 2017

Самое эффективное и дружественное решение для GC, которое я нашел, это Chronicle Queue .Он имеет чрезвычайно низкую задержку записи, порядка десятков наносекунд, на несколько градусов ниже, чем MapDB или SQLite.

1 голос
/ 03 марта 2011

Вы можете встроить Berkley db Java Edition для хранения элементов очереди в файлах.

Вы можете посмотреть рабочий пример здесь: http://sysgears.com/articles/lightweight-fast-persistent-queue-in-java-using-berkley-db

Надеюсь, это поможет

1 голос
/ 01 июля 2010

Почему очередь ограничена? Почему бы не использовать динамически расширяемую структуру данных? Это кажется намного проще, чем использование диска.

Edit: Трудно ответить на ваш вопрос без дополнительного контекста.

Можете ли вы уточнить, что вы подразумеваете под "нехваткой памяти"? Насколько велика очередь? Сколько у тебя памяти?

Вы используете встроенную систему с очень небольшим объемом памяти? Или у вас 2 или более ГБ в очереди?

Если любое из них истинно, вам действительно следует использовать «заменяемую» структуру данных, например BTree. Реализация одного за одну очередь кажется излишним. Я бы просто использовал встроенную базу данных, такую ​​как SQL lite.

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

Редактировать 2: Вам, вероятно, не нужен BTree или база данных. Вы можете просто использовать связанный список страниц. Но опять же Я должен спросить: это необходимо?

Или, если вы готовы обрабатывать вещи не по порядку, почему бы не иметь несколько потоков для чтения все время?

В конечном счете, хотя я не думаю, что ваше предложение - это путь.

0 голосов
/ 15 мая 2015

MapDB предоставляет одновременные карты, наборы и очереди, поддерживаемые дисковым хранилищем или памятью без кучи Это быстрый и простой в использовании встроенный движок базы данных Java.

https://github.com/jankotek/MapDB

http://www.mapdb.org/

...