2012-12-12 2 views
5

나는 꽤 오랫동안 프랙탈 궤도를 생성하는 Java 프로그램을 연구 해왔다. 사진과 마찬가지로 이미지가 클수록 축소 될 때 더 좋습니다. 이 프로그램은 점의 값이 계산 될 때 기록되는 2D 객체 (점) 배열을 사용합니다. 즉, 포인트가 해당 값에 저장되어 있습니다. 즉 :자바 힙 하드 드라이브

Point p = new Point(25,30); 
histogram[25][30] = p; 

물론 간단하게 편집했습니다. 포인트 값을 CSV에 쓰고 나중에 래스터에 적용 할 수 있지만 비슷한 방법을 사용하면 바람직하지 않은 결과가 발생합니다. 이 배열을 가지지 않아서 공간이 더 큰 이미지를 만들 수있어서 좋았 기 때문에 나는 꽤 오랫동안 노력했습니다. 그냥 작동하지 않습니다. 명확성을 위해 Point 객체가 색상 데이터를 저장한다는 점을 추가하고 싶습니다.

다음 문제는 배열과 동일한 크기를 갖는 WriteableRaster입니다. 두 사람을 합치면 엄청난 기억이납니다. 나는 그것이 여러 번 행해지는 방식을 바꾸려고 시도한 후에 이것을 받아 들였고, 각각은 더 낮은 품질의 결과를 가져왔다.

메모리와 시간을 최적화하기 위해 노력한 결과 RAM이 실제로 제한된다는 결론에 도달했습니다. 이것이 내가 바꾸고 싶은 것입니다. 나는 -Xmx 스위치 (10GB로 설정)에 대해 알고 있습니다. 래스터 및/또는 배열을 저장하기 위해 Windows의 가상 메모리를 사용할 방법이 있습니까? 나는 이것이 상당한 성능 저하를 초래한다는 것을 잘 알고 있지만, 품질 저하 대신에 실제로 많은 선택이없는 것으로 보인다.

+1

[Berkeley DB] (http://www.oracle.com/)를보고 싶다고 생각합니다.com/technetwork/products/berkeleydb/overview/persistence-160890.html), 특히 POJO에 대한 어노테이션 기반 지속성. –

답변

2

OS가 이미 당신을 위해 RAM 물론 모든 과정에 하드 드라이브 공간을 만드는 : 내 질문 (마지막 단락)에 이미 주어진 답을 확인하시기 바랍니다. 이것은 당신이 생각하는 것보다 더 많은 성능 재앙이 될 것입니다. 효과적으로 작동하지 않을 정도로 천천히 움직일 것입니다.

메모리 매핑 파일을 찾으십니까? http://docs.oracle.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

실제로 메모리에서 수행해야하는 경우 일부 최적화 작업으로 메모리 사용량을 크게 줄일 수 있습니다. 예를 들어, Point 개체는 대부분 오버 헤드이며 데이터는 아닙니다. 참조에 필요한 바이트를 계산 한 다음 Object 오버 헤드의 경우 두 개를 ints과 비교합니다.

두 개의 커다란 병렬 int 배열로 x 및 y 좌표에 대한 오버 헤드를 줄일 수 있습니다. 물론 코드에 액세스하려면이 코드를 캡슐화해야합니다. 그러나이 데이터 구조에 대한 메모리 사용량을 절반으로 줄일 수 있습니다. 수백만 개에 달하는 적은 수의 객체로도 GC 실행 속도가 향상됩니다.

메모리에 WritableRaster을 넣는 대신 이미지 파일을 간단한 이미지 형식으로 직접 작성하는 것이 좋습니다. BMP는 매우 간단합니다. 그런 다음 외부 도구를 사용하여 효율적으로 변환하십시오.

개체 오버 헤드를 줄이기 위해 -XX:+UseCompressedOops을 시도해보십시오. 또한 -XX:NewRatio=20 또는 그 이상을 사용하여 JVM이 수명이 긴 오브젝트에 대한 거의 모든 힙을 예약하도록하십시오. 실제로 더 많은 힙을 사용할 수 있습니다.

+0

예제에서 보여주지는 않았지만 Point 객체에는 색상 데이터도 포함되어 있습니다. 나는 훨씬 더 작은 것 대신에 Point 클래스를 척하려고한다. 그러나 적어도 3 가지 (가장 큰) 클래스가 거의 전부 재 작성되어야합니다. 처음에는 열악한 디자인 선택. 프로그램을 다시 작성하면이 문제를 해결할 것입니다. JPEG에 직접 쓰는 방법을 알고 있습니까? 래스터를 제거하는 것은 신의 선물이 될 것입니다. 그렇지 않다면 나는 BMP에 글을 쓸 것이다. JPEG에 대한 유일한 이유는 내가 시도한 많은 이유 중 하나입니다. 최고의 대량 이미지 리사이 저만 JPEG 파일 만 허용합니다. – Fractalife

0

운영 체제가 스왑 메모리에서 할당하도록 JVM 메모리 매개 변수 (Xmx)를 구성하지 않는 것이 좋습니다. 분명히 가비지 수집 메커니즘은 힙 메모리에 임의 액세스 할 필요가 있으며, 그렇지 않은 경우 프로그램은 오랜 시간 동안 스레 쉬어 잠글 수 있습니다. - 필요 없음 마법

does large value for -Xmx postpone Garbage Collection

관련 문제