2010-06-30 11 views
11

Mam kolejkę ograniczoną w pamięci, w której wiele wątków umieszcza obiekty w kolejce. Zwykle kolejka powinna być opróżniana przez pojedynczy wątek czytnika, który przetwarza elementy w kolejce.Implementowanie kolejki opartej na plikach

Istnieje jednak możliwość, że kolejka jest wypełniona. W takim przypadku chciałbym zachować dodatkowe elementy na dysku, które byłyby przetwarzane przez inny wątek czytnika tła, który skanuje katalog dla takich plików i przetwarza wpisy w plikach. Znam Active MQ, ale wolę bardziej lekkie rozwiązanie. Jest ok, jeśli "FIFO" nie jest ściśle przestrzegane (ponieważ trwałe wpisy mogą być przetwarzane poza kolejnością).

Czy są dostępne rozwiązania Open Source? Nie znalazłem żadnej, ale myślałem, że będę pingować tę listę dla sugestii zanim sam zacznę implementację.

Dziękujemy!

Odpowiedz

4

Można użyć coś takiego SQLLite do przechowywania obiektów.

+0

Przeszło mi przez myśl, ale naprawdę nie potrzebuję funkcjonalności SQLLite - nie potrzebuję SQL. – serverman

+0

@serverman Wiem, że można go użyć jako mechanizmu przechowywania plików, a następnie pobrać według kolejności znacznika czasu. –

+0

Witam Romain Uzgodniono. Próbuję nie dodawać kolejny składnik SQL dla osób działających tylko dla tej jednej funkcji. Ale tak - masz rację, że mogę używać SQLLite. – serverman

3

EHCache może przepełnić się na dysk. Jest to także bardzo zbieżne, choć naprawdę nie trzeba, że ​​

+0

Zajrzę do tego ... thanx! – serverman

1

Dlaczego kolejka ograniczony? Dlaczego nie skorzystać z dynamicznie rozszerzalnej struktury danych? Wydaje się to o wiele prostsze niż angażowanie dysku.

Edytuj: Trudno jest odpowiedzieć na to pytanie bez większego kontekstu.

Czy możesz wyjaśnić, co masz na myśli przez "zabrakło pamięci"? Jak duża jest kolejka? Ile masz pamięci?

Czy masz wbudowany system z bardzo małą ilością pamięci? A może masz 2 GB lub więcej rzeczy w kolejce?

Jeśli jedna z nich jest prawdziwa, naprawdę można użyć "wymiennej" struktury danych, takiej jak BTree. Wdrożenie jednego dla siebie w kolejce wydaje się przesadą. Po prostu użyłbym wbudowanej bazy danych, takiej jak SQL Lite.

Jeśli żadna z tych osób nie jest prawdziwa, wystarczy użyć wektora lub połączonej listy.

Edytuj 2: Prawdopodobnie nie potrzebujesz urządzenia BTree ani bazy danych. Możesz po prostu użyć połączonej listy stron. Ale znowu, Muszę zapytać: czy to konieczne?

Jeśli chcesz przetwarzać dane w sposób inny niż seryjny, dlaczego nie chcesz mieć wielu wątków przez cały czas?

Ostatecznie nie sądzę, że twoja propozycja jest do zrobienia.

+0

Kolejka jest ograniczona, więc nie zabraknie nam pamięci. – serverman

+0

Zobacz moje aktualizacje. –

+0

Cześć Scott, dobre punkty. Nie, to nie jest system wbudowany. Istnieje jednak niewielka szansa, że ​​z powodu nagłego wybuchu aktywności kolejka staje się pełna. Aplikacja musi sobie z tym poradzić (nawet jeśli zdarza się to rzadko) Skłaniam się ku SQLLite, o którym słyszałem tylko do tej pory :) Dziękuję! – serverman

5

Spójrz na http://square.github.io/tape/, a jej imponujące QueueFile.

(podziękowania dla Briana McCallistera "The Long Tail Treasure Trove" za wskazanie mi tego).

+3

Obecnie patrzę na tę bibliotekę i chociaż interfejs API jest prosty w obsłudze, nie obsługuje on równoczesnych odczytów/zapisów do tego samego sklepu z wielu procesów. OP może nie potrzebować tej funkcji, ale chciał ją wskazać.(Czy może po prostu napotkano udokumentowany problem zapisu, który może uszkodzić plik w systemie plików nieokreślonym w dzienniku?) –

+1

Oryginalny plik QueueFile miał wielowątkowy błąd do zapisu. Znaleźliśmy i rozwiązaliśmy ten problem. Opublikowalem to (i niektóre klasy rozszerzeń) jako sedno: https://gist.github.com/serranom/496cacd9d9278d1770a1 –

+0

To wydaje się lepszym rozwiązaniem, jeśli chce się mieć lekką kolejkę z plikami. –

1

najbardziej wydajnych i GC obsłudze rozwiązanie znalazłem teraz jest Chronicle Queue. Ma bardzo niską opóźnienie zapisu, rzędu dziesiątek nanosekund, kilka stopni wielkości niższych niż MapDB lub SQLite.

Powiązane problemy