2011-12-02 3 views
7

바이너리 데이터를 저장할 이상적인 장소 (성능 효율적이고 유지 관리가 용이)를 찾고 있습니다. 내 경우에는 이미지입니다. 몇 가지 이미지 처리를해야하며, RESTful 서비스를 통해 액세스 할 수있는 적절한 위치에 이미지와 저장 공간을 저장해야합니다.이상적인 장소 저장 url을 호출하여 렌더링 할 수있는 이진 데이터

  1. MongoDB를 같은 NoSQL이 솔루션은, GridFS
  2. 웹 서버를 사용하여 다음 디렉토리 계층 구조의 파일 시스템에 파일로 저장하고 : 내 연구에서

    지금까지 내가 좋아하는 몇 가지 옵션이 있습니다 , Memcache를 같은 캐시 뭔가
  3. 스토어 URL
  4. 아파치 잭 래빗 문서 저장소에 의해
오징어 프록시를 이미지에 액세스

어떤 생각을 고르려고하는지, 왜 유용할까요? 더 좋은 방법이 있습니까?

답변

1

이미지를 다른 옵션으로 RDBMS에 저장하면 무결성, 보안 등 (데이터베이스에 올바르게 설정되어있는 경우)에 대한 보장을 받고 여분의 메타 데이터를 저장하고 SQL을 사용하여 컬렉션을 관리합니다.

+1

시스템에 입력되는 파일의 양이 매우 많은 응용 프로그램에서는 항상 옵션이되는 것은 아닙니다. BLOB는 전체 파일로 저장되고 청크되지 않으므로 행 값이 실제로 커질 수 있고 DB 백업이 기하 급수적으로 커질 수 있습니다. 이 옵션을 사용하기 전에 항상 복제 고려 사항과 입력 볼륨을 고려해야합니다. – DeaconDesperado

7

방금 ​​설명한대로 GridFS를 사용하기 시작했습니다.

지금까지 경험 한 바에 따르면 GridFS의 가장 큰 장점은 별도의 파일 저장 시스템이 필요 없다는 것입니다. 우리의 전체 퍼시스턴스 계층은 이미 Mongo에 들어 있으므로, 다음 논리적 단계는 파일 시스템을 거기에 저장하는 것입니다. 플랫 네임 스페이스는 단지 흔들리고, 당신이 원하는 메타 데이터를 기반으로 파일을 불러올 수있는 풍부한 쿼리 언어를 허용합니다. 우리의 응용 프로그램에서 우리는 모든 소유권 정보를 임베디드 한 'appdata'객체를 사용했습니다.

NoSQL 파일 저장소, 특히 GridFS에서 고려해야 할 또 다른 사항은 다른 데이터와 함께 분할 및 확장한다는 것입니다. mongo 서버 안에 전체 DB 키 - 값 저장소가 있다면, 결국 더 많은 머신으로 서버 클러스터를 확장해야한다면 결국 파일 시스템도 커질 것입니다.

바이너리 데이터 자체가 고전적인 디렉토리 기반 파일 시스템에 익숙한 잠재 고객 인 덩어리로 나뉘어지기 때문에 약간의 '블랙 박스'를 느낄 수 있습니다. 이것은 RockMongo와 같은 관리자 프로그램의 도움으로 완화됩니다.

모두 이미지를 GridFS에 저장하는 것은 문서 자체를 삽입하는 것만큼이나 쉽습니다. 모든 주요 언어의 드라이버가 대부분 당신을 위해 처리합니다. 우리 환경에서 우리는 엔드 포인트에서 이미지 업로드를 가져오고 PIL을 사용하여 크기 조정을 수행했습니다. 그런 다음 이미지를 mongo에서 가져 와서 다른 끝점에서 데이터를 출력하고 jpeg로 mimetyped했습니다.

행운을 빈다.

편집 :

가 GridFS에 업로드 당신에게 사소한 파일의 예를 제공하려면, 여기 PyMongo, 파이썬 라이브러리에있는 간단한 방법입니다. 당신이 당신의 쿼리 응용 프로그램에 대한 사용자 지정과 관련된 정보를 기반으로 할 경우 정말 도움이 될 수있는, 좋아하는 경우에

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! 

는 또한 사용자 정의 값에 대해 조회 할 수 있습니다.

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

는 어원이 단지 몇 가지 간단한 예, 다른 언어 (PHP, 루비 등) 모든 많이 용 드라이버입니다.

나는 그것의 REST 프레임 워크 슬링과 함께 잭 래빗 갈 것
+0

공유 해 주셔서 감사합니다. 정말로 감사드립니다. 디스크 I/O를 읽는 것이 더 비싸다고 생각하거나 모든 데이터를 한 곳에 모아 둔 이유가 Mogo에서 있었고 지금까지 어떻게 수행되고 있습니까? – dineshr

+0

파일 입출력 시간은 실제로 우리의 결정에 영향을 미치지 않았지만, 참조의 경우 가져 오기 시간은 sql의 표준 색인화 된 질의와 유사합니다. 파일의 양이 극도로 높기 때문에 수평으로 파기 될 수있는 큰 네임 스페이스를 갖는 매력이 주된 이유였습니다. GridFS를 사용하면 디렉토리 구조가 더 이상 문제가되지 않으며 파일을 가져 와서 API 드라이버를 사용하여 삽입 할 수 있습니다. 그것은 URL 요청이 응답을 결정한 RESTful 앱에서 훌륭하게 작동했습니다. – DeaconDesperado

3

슬링은 REST 호출 또는 WebDAV를 통해 기본 잭 래빗 저장소에 저장 할 수있는 가능성과 함께 당신에게 확대됨에 스토리지를 제공하는 동안 당신은/다운로드 파일을 업로드 할 수 있습니다 http://sling.apache.org

당신의 파일을 트리 구조 (또는 원하는 경우 플랫)로 만듭니다.

jackrabbit 및 sling은 업로드 후 이미지를 비동기 적으로 처리하여 축소판을 만들 수있는 이벤트 메커니즘을 지원합니다.

http://sling.apache.org/site/manipulating-content-the-slingpostservlet-servletspost.html의 설명서에는 슬링이 제공하는 REST 인터페이스를 사용하여 데이터를 조작하는 방법이 설명되어 있습니다.

관련 문제