2010-04-13 2 views
4

우리는 서버 (Java EE) 애플리케이션을 가지고 있으며 사용자 요청을 기반으로 일부 이미지 처리 작업을 수행합니다. 이미지 형식 (예 : TIFF를 JPEG로 변환), 이미지 색상 (예 : RGB를 회색에서 BW로 변환), 이미지 재 샘플링 (크기 재조정) 등. 인쇄 업계의 일부 고객은 2000 dpi, 6 * 8 인치, 4 색 구성 요소와 같이 6 * 2000 * 8 * 2000 * 4 = 768MB 메모리를 사용하는 매우 큰 이미지를 사용합니다. 서버는 메모리에 큰 이미지를 저장할 수 없으므로 스트라이프별로 프로세스 스트라이프를 결정합니다. 문제는 동시에 많은 고객이있을 수 있기 때문에 여전히 효과가 없다는 것입니다. 메모리 제한 이미지 처리를 구현하는 방법에 대해 알고 계신가요? 또는 일부 종이/기사가 우리에게 솔루션을 제공 할 수 있는지 알고 있습니까?서버의 메모리 제한 이미지 처리

감사합니다,

+2

more hardware – Pyrolistical

답변

0

그럼 당신이 알아야 할 첫 번째 것은 당신이 할당 할 수있는 메모리의 양이 당신이 얼마나 많은 RAM에 의존하지 않는다는 것입니다. OS는 가상 메모리를 관리하며 모든 할당은 가상 메모리에서 수행됩니다. 청크는 OS에 의해 RAM/디스크로 페이징됩니다. 너는 이것에 대한 통제권이 없다. RAM에 5MB를 할당한다고 생각할 수도 있지만, 필요할 때 RAM에서 유지하거나 디스크에서 프로그램으로 가져 오는 것은 OS에 달려 있습니다. Windows 32 비트에서는 작업 할 2GB의 사용자 공간이 있습니다 (나머지는 커널 공간에서 사용됩니다). 64 OS 비트에서 그 양은 훨씬 더 큽니다.

그러나 할당 할 수있는 2GB의 사용자 공간 (32 비트 OS 이상 64 비트)이 있다고해서 메모리 할당이 연속적인 메모리 블록을 필요로하므로 항상 큰 용량의 청크를 할당 할 수있는 것은 아닙니다. 따라서 메모리 단편화가 문제가 될 수 있습니다.

세 번째 사항은 할당 할 수있는 메모리 양을 JVM이 제한한다는 것입니다. 따라서 힙 크기를 제한하는 -Xms -Xmx 매개 변수를 늘려야합니다.

이러한 의견 이외에 다른 해결책이 없습니다.

+0

예 VM 메커니즘을 완전히 이해합니다. 내 문제는 64MB와 같이 제한된 메모리 크기 내에서 이미지를 처리 ​​할 수있는 솔루션이 필요하다는 것입니다. 단순히 메모리를 확대하는 것이 우리의 첫 번째 선택은 아닙니다. 사실 우리가 한 것은 64 비트 머신을 사용하고 -Xmx에 대해 매우 큰 값을 설정하는 것입니다. 하지만 32 비트 컴퓨터에서는 작동하지 않습니다. – xeranic

+0

예. 실제로 쉬운 해결책이 없다고 생각합니다. 당신이 청크로 처리하기 위해 분해 할 수 있다고 말한 것처럼, 다른 고객에게는 시간이 중요해진다. OpenCL (또는 CUDA)에서 알고리즘을 구현하고 GPU 어레이를 사용하여 병렬 처리에서보다 빠른 속도를 얻을 수 있습니다. 이미지 인코딩과 같은 것들은 일반적으로 독립적 인 블록으로 이루어 지므로 이러한 알고리즘은 확장 성이 뛰어납니다. – Budric

0

"타일 된"이미지 처리 기술을 사용할 수 있습니다. 예를 들어, IPP는 타일링 된 이미지 처리를 지원합니다.

+0

Tiled Image Processing의 Intel IPP를 사용하는 모범 사례를 알고 있습니까? 예를 들어, 타일의 가장 최적화 된 모양은 무엇입니까 (메모리 연속성을위한 행 수 또는 비 연속 메모리에서 이미지를 자르고 캐시에서는 더 작은 이미지를 자르는 사각형)? – Royi

2

이미지 처리 부분을 별도 RMI 또는 이와 유사한 도구를 사용하여 주 응용 프로그램과 통신하는 JVM으로 이동하는 것이 좋습니다.

이렇게하면 처리 JVM을 기본 JVM과 별도로 조정할 수 있으며 필요한 경우 여러 시스템에서 분산 시스템을 만들 수도 있습니다. 이렇게하면 전환을 관리 할 수 ​​있으므로 동시에 몇 개만 발생하면 더 큰 개별 이미지가 허용됩니다.

이 작업을 수행하는 것을 금하는 제한 사항이 있습니까?

마지막 수단으로, 실제 이미지 변환을 Linux의 ImageMagick과 같은 네이티브 프로그램으로 옮기는 것이 좋습니다.이 프로그램은 사용자의 프로그램에서 호출 한 다음 변환을 수행하고 사용자에게 JVM을 출력합니다. 이것은 틀림없이 CPU가 더 빠르며 메모리가 덜 필요합니다.