2012-02-17 2 views
4

저는 주어진 시간에 약 40,000 명의 온라인 사람들과 웹 사이트를위한 기본 갤러리를 코딩하고 있습니다. 사용자는 갤러리를 만들고 이미지를 업로드 할 수 있습니다.500.000 개의 이미지를 저장하는 가장 효율적인 방법은 무엇입니까?

제 질문은 각 갤러리마다 별도의 폴더를 만들고 이미지를 넣거나 단일 폴더로 만들고 모든 이미지를 넣되 데이터베이스의 각 이미지마다 gallery_id를 유지해야합니까? 또는 모든 사용자에 대한 디렉토리를 만들고 그 안에 갤러리 이름을위한 다른 디렉토리를 만들어야합니까?

어떻게 하시겠습니까?

ps. 가능한 한 가볍게해야합니다.

+1

어떤 OS 및 파일 시스템입니까? –

+0

Linux. (Cent OS) 나는 그들의 서버에 접근 할 수 없기 때문에 파일 시스템을 모른다. – Aristona

+1

아마존 s3과 그 API를 사용하고, 폴더를 저장하지 않고, 데이터베이스에 관계형 테이블만을 사용하여 추적 할 수 있습니다. –

답변

8

나는 id 으로 그들을 저장할 것이고 나는 파일 시스템에 종속적이며, 어떤 것은 하나의 폴더에 많은 파일을 가지고 잘 수행하지 못한다. 또한 수동으로해야한다면 더 쉽게 찾을 수있다. 좀 봐

각 파일에 ID를 부여한 다음 파일 이름의 처음 3 자리를 사용하여 폴더로 분할하십시오. (당신은 100000 제로 패드 ID에 당신의 자동 증가 카운터를 시작, 그래서 적어도 3 단계

/photos/1/0/3/103456.jpg 
/photos/9/4/1/941000.jpg 
/photos/0/0/0/000001.jpg 

당신은 데이터베이스에 사용자/갤러리/등으로 사진의 관계를 저장할 수있다 할 수

또는 당신은 큰 소년이 어떻게보고 싶은 경우

Needle in a haystack: efficient storage of billions of photos

+1

+1 좋은 답변이지만 ID가 균일하게 확산되고 한 폴더에 너무 많은 파일로 끝나지 않도록 내 대답에 말한 것처럼 해시 함수를 사용하는 것이 좋습니다 – hackartist

+1

우수 제안. 이와 같이 분할하면 미래의 파티셔닝이 가능합니다. 예를 들어 첫 번째 자릿수는 디렉토리가 아니라 서버가 될 수 있습니다. 나는 1 천만 개가 넘는 이미지가있는 사이트를 관리하며 비슷한 설정을 사용합니다. –

+0

답장으로 답장을 보내 주셔서 감사합니다. – Aristona

3

(최근 7 만 처리했다 일반적으로 웹 서버는 단일 폴더에 수천 이미지 이상하고 싶지 않아 멋쟁이를 일으키는 이미지 r 느린 읽기 및 정렬이 너무 날 믿어) 그래서 확실히 당신이 수천 개의 이미지를 가질 것이라고 생각한다면 하나의 폴더가 아닙니다. 나는 최선의 해결책은 CDN CloudFront에 연결된 아마존의 S3를 호스트하는 것이지만, 그것이 현실적이지 않다면 당신은 여전히 ​​당신 자신의 서버에서 여러 가지 일을 할 수 있다고 제안 할 것이다.

갤러리가 얼마나 큰지에 대한 경계를 알고 있고 얼마나 많은 갤러리를 만들지에 대한 아이디어가있는 경우에만 각 갤러리마다 별도의 폴더를 만드십시오. (지금 당장 귀하의 구체적인 문제에 대해 제안 할 것입니다.)

해시 함수를 통해 이미지 이름을 입력 한 다음 해시의 처음 1-3 문자를 사용하여 폴더 이름을 지정하여 이미지를 넣습니다. 해시를 사용하면 이미지가 폴더간에 거의 균등하게 분할되고 필요한 폴더 수를 결정할 수 있습니다.

어쨌든 실제 경로에있는 갤러리와 이미지 ID 정보는 코드에서나 사람이 서버에서 버그를 찾아야 할 때 유용합니다. 갤러리 ID를 기반으로 폴더의 이름을 지정하고 갤러리에 몇 천 개 이상의 이미지가 포함되어 있는지 확인하십시오.

0

내가 이렇게 내 저장 : 내가 나중에 무엇을 검사해야하는 경우

images/userid/photoid 

이 방법 나는 빨리 사용자 이미지를 분리 할 수 ​​있습니다. 그것은 하나의 중앙 디렉토리에 모든 것을 삭제하는 것보다 조직적으로 보인다.

관련 문제