2012-12-17 9 views
3

GET 요청에서 이미지를 전달하는 API가있는 서블릿이 있습니다. 서블릿은 GET 요청의 매개 변수를 기반으로 CAD 명령의 데이터 파일을 작성합니다. 이 데이터 파일은 파일 시스템에 이미지를 만드는 이미지 파서로 전달됩니다. 서블릿은 이미지를 읽고 응답의 바이트를 반환합니다.Java를 사용한 동적 이미지 캐싱

이미지 파서 프로그램의 모든 IO 및 호출은 매우 부담이 될 수 있으며 로컬 시스템에서 약 80kb의 이미지가 3-4000ms 렌더링됩니다.

약 20 개의 매개 변수가 GET 요청을 구성합니다. 각각은 이미지의 다른 부분과 관련이 있습니다. 따라서 가능한 이미지의 조합이 매우 큽니다.

로딩 시간을 줄이기 위해 렌더링 된 이미지의 BLOB를 데이터베이스에 저장할 계획입니다. GET 요청이 이전에 실행 된 요청과 일치하면 캐시에서 가져옵니다. 그렇지 않으면, 나는 새 것을 렌더링 할 것이다. 이것은 "최초"실행을 수정하지 않지만 "n + 1 실행"을 도울 것입니다.

성능 향상 방법에 대한 다른 아이디어가 있습니까?

+1

wget을 사용하고 이미지를 스크립트를 통해로드 한 다음 첫 번째 요청이 들어 왔을 때 사용하는 방법은 어떻습니까? 비동기 프로세스로 주기적으로 wget을 호출하는 스케줄러를 실행할 수도 있습니다. – dinukadev

+0

그건 내 첫 번째 본능이기도하다. 그러나 필요한 이미지의 수는 엄청납니다. 나는 정확한 양을 모르지만 확실히 1t보다 크고 지속적으로 확장하고 있습니다. –

+0

해시 코드로 이미지를 인덱싱하고 스케줄러를 사용하여 일반적으로 많이 사용되는 이미지를 데이터베이스에 자동으로 미리 캐싱했습니다. 지금까지 성과는 견디고 있습니다. –

답변

2

데이터베이스 저장소는 일반적으로 파일 시스템 저장소보다 비용이 높기 때문에 디스크에 이미지 파일을 저장할 수 있습니다.

http get 매개 변수를 정렬하고 매개 변수 별 빠른 쿼리를 위해 해당 이미지 레코드의 인덱스로 해시합니다.

저장 각 레코드에 대한 lastAccessedTime, 이미지가 요청 될 때마다 업데이트 :

당신이 사용되지 않는 또는 거의 사용되지 않는 레코드를 제거해야 프로그램이 충분하지 않은 경우 디스크 용량을 밟지 확인합니다.

스케줄러를 사용하여 lastAccessedTime을 확인하고 지정된 가중치보다 낮은 레코드를 제거합니다. 다른 전략을 사용하여 lastAccessedTime, reachedCount, 이미지 크기 등과 같은 가중치를 계산할 수 있습니다.

+0

이전 파일을 정리하는 전략이 마음에 듭니다. 내 데이터베이스가 하드웨어에 함께 위치해 있기 때문에 디스크에있는 파일과 데이터베이스에 관한 파일이 맞는지 잘 모르겠습니다. –

1

렌더링 파이프 라인에 입력하는 모든 매개 변수를 예측 가능한 방식으로 단일 문자열로 변환하여 입력의 SHA1 해시를 계산 한 다음 출력 파일을 SHA1이 포함 된 디렉터리에 파일로 저장할 수 있습니다 이름, 그런 식으로 동일한 매개 변수로 요청을받는 경우 해시를 계산 한 다음 파일이 디스크에 있는지 확인하십시오. 그렇지 않으면 반환 파이프 라인에 작업을 보내고 파일을 만듭니다.

파일이 많은 경우 하나 이상의 디렉토리를 사용하고 싶을 수 있습니다. 영감을 얻기 위해 SHA1의 처음 몇 문자를 사용하여 디렉토리 전체에서 파일을 어떻게 분할하는지보십시오.

나는 내 응용 프로그램에서 비슷한 설정을 사용합니다. 단지 파일을 저장하는 것이 아니며 파일은 db에 저장되지만 성능상의 이유로 파일 내용의 sha1 해시를 파일 이름/파일의 URI.

+0

좋은 아이디어. 생각해 볼만한 제비 뽑기를 감안할 때. –