2011-12-02 9 views
7

Szukam idealnego (wydajnego i konserwowalnego) miejsca do przechowywania danych binarnych. W moim przypadku są to obrazy. Muszę wykonać pewne przetwarzanie obrazu, skalować obrazy i przechowywać w odpowiednim miejscu, do którego można uzyskać dostęp za pośrednictwem usługi REST.Idealne miejsce do przechowywania danych binarnych, które można renderować, wywołując adres URL:

Z moich badań do tej pory mam kilka opcji, takich jak:

  1. rozwiązanie NoSQL jak MongoDB, GridFS
  2. Zapisywanie jako pliki w systemie plików w hierarchii katalogów, a następnie za pomocą serwera WWW dostęp do obrazów przez url
  3. repozytorium Apache Jackrabbit
  4. Dokument
  5. przechowywać w pamięci podręcznej coś takiego Memcache, Squid proxy

Jakieś przemyślenia, które wybrać i dlaczego byłyby przydatne lub czy istnieje lepszy sposób na zrobienie tego?

Odpowiedz

1

Przechowywanie obrazów jako obiektów BLOB w RDBMS w innej opcji, a użytkownik otrzymuje natychmiast gwarancje dotyczące integralności, bezpieczeństwa itp. (Jeśli jest to poprawnie skonfigurowane w bazie danych), przechowywania dodatkowych metadanych, zarządzania kolekcją za pomocą SQL itp.

+1

Należy zauważyć, że w aplikacjach, w których ilość plików umieszczanych w systemie jest bardzo wysoka, nie zawsze jest to opcja. Obiekty blob są przechowywane jako pełne pliki i nie są porcjowane, więc wartości wierszy mogą stać się naprawdę duże i sprawić, że kopie zapasowe DB będą wykładniczo większe. Przed skorzystaniem z tej opcji należy zawsze rozważyć kwestie replikacji i wielkość wejściową. – DeaconDesperado

7

Właśnie zacząłem używać GridFS do zrobienia dokładnie tego, co opisałeś.

Z dotychczasowych doświadczeń wynika, że ​​główną zaletą GridFS jest to, że eliminuje potrzebę oddzielnego systemu przechowywania plików. Nasza cała warstwa trwałości jest już umieszczona w Mongo, więc następnym logicznym krokiem będzie przechowywanie naszego systemu plików również tam. Płaskie spacje nazwiskowe są po prostu kamieniami i pozwalają na bogaty język zapytań do pobierania plików na podstawie dowolnych metadanych, które chcesz do nich dołączyć. W naszej aplikacji użyliśmy obiektu "appdata", który zawierał wszystkie informacje o własności, zapewniające inną rzecz do rozważenia w przypadku przechowywania plików NoSQL, a szczególnie GridFS, jest to, że będzie on odfiltrowany i rozszerzony wraz z innymi danymi. Jeśli cały magazyn DB-klucz przechowujesz w serwerze mongo, to w końcu, jeśli będziesz musiał rozbudować klaster serwerów o więcej maszyn, twój system plików będzie się powiększał wraz z nim.

Może czuć się trochę "czarną skrzynką", ponieważ same dane binarne są podzielone na części, co przeraża te używane do klasycznego systemu plików opartego na katalogach. Jest to łagodzone przy pomocy programów administracyjnych takich jak RockMongo.

W sumie do przechowywania obrazów w GridFS jest tak proste, jak samodzielne wstawianie dokumentów, większość sterowników dla wszystkich głównych języków obsługuje wszystko dla Ciebie. W naszym środowisku pobieraliśmy obrazy w punkcie końcowym i używaliśmy PIL do zmiany rozmiaru. Obrazy zostały następnie pobrane z mongo w innym punkcie końcowym, który właśnie wyprowadził dane i mimetypował je jako jpeg.

Powodzenia!

EDIT:

Aby dać przykład Trivial File przesłać z GridFS, oto najprostsze podejście w PyMongo, biblioteki Pythona.

from pymongo import Connection 
import gridfs 

binary_data = 'Hello, world!' 

db = Connection().test_db 
fs = gridfs.GridFS(db) 
#the filename kwarg sets the filename in the mongo doc, but you can pass anything in 
#and make custom key-values too. 
file_id = fs.put(binary_data, filename='helloworld.txt',anykey="foo") 
output = fs.get(file_id).read() 
print output 
>>>Hello, world! 

Można również zapytać przed swoimi wartościami niestandardowymi, jeśli chcesz, które mogą być bardzo przydatne, jeśli chcesz, aby Twoje zapytania opierać się o zamówienie w stosunku do danego zastosowania.

try: 
    file = fs.get_last_version({'anykey':'foo'}) 
    return file.read() 
catch gridfs.errors.NoFile: 
    return None 

To tylko kilka prostych przykładów i sterowniki wiele innych języków (PHP, Ruby, itp) wszystkie mają cognates.

+0

Dzięki za udostępnienie, naprawdę to doceniamy. Czy myślisz, że czytanie z dysku I/O jest droższe lub po prostu posiadanie wszystkich danych w jednym miejscu było powodem, aby mieć go w mogo i jak to się dzieje do tej pory? – dineshr

+0

Plik IO nie wpłynął istotnie na naszą decyzję, ale dla odniesienia czas pobierania jest porównywalny ze standardowym zapytaniem indeksowanym w sql. Ponieważ objętość plików jest bardzo duża, główną przyczyną były atrakcje związane z posiadaniem jednej dużej przestrzeni nazw, którą można było przesunąć w poziomie. Korzystanie z GridFS sprawia, że ​​struktura katalogów nie stanowi już problemu, a pliki można pobierać i wstawiać za pomocą sterowników interfejsu API. Udało się to znakomicie w aplikacji RESTful, w której adres URL zażądał określonej odpowiedzi. – DeaconDesperado

3

pójdę do Jackrabbit w połączeniu z REST ramowej temblaku http://sling.apache.org

Chusta pozwala na przesyłanie/pobieranie plików poprzez REST wzywa lub WebDAV, gdy instrument bazowy repozytorium Jackrabbit daje wydajnych pamięci masowej z możliwością przechowywać pliki w strukturze drzewa (lub płaskie, jeśli chcesz).

Zarówno "jackrabbit", jak i proca obsługują mechanizm zdarzeń, w którym można asynchronicznie przetwarzać obraz po przesłaniu do np. Tworzyć miniatury.

W podręczniku pod numerem http://sling.apache.org/site/manipulating-content-the-slingpostservlet-servletspost.html opisano sposób manipulowania danymi za pomocą interfejsu REST udostępnionego przez zawiesia.

Powiązane problemy