2010-12-21 3 views
4

저는 자바 프로그래밍에 익숙하지 않으므로 제게 새로운 질문을 용서해주십시오 :).LinkedHashMap을 사용한 다차원 바이트 배열 ... 더 좋은 방법이 있습니까?

개발을 돕기 위해 수정중인 응용 프로그램의 파일 캐시로 LinkedHashMap을 사용하고 있습니다. I/O 오버 헤드를 줄이기 위해이 작업을 수행하므로 성능이 향상됩니다. 이 문제는 오버 헤드가 다른 많은 방법으로 도입된다는 점입니다.

관련 소스는 다음과 같습니다.

// Retrieve Data From LinkedHashMap 
byte grid[][][] = null; 
if(file.exists()) 
{ 
    if (!cache.containsKey(file)) 
    { 
     FileInputStream fis = new FileInputStream(file); 
     BufferedInputStream bis = new BufferedInputStream(fis, 16384); 
     ObjectInputStream ois = new ObjectInputStream(bis); 
     cache.put(file, ois.readObject()); 
     ois.close(); 
    } 
    grid = (byte[][][]) cache.get(file); 
} else { 
    grid = new byte[8][8][]; 
} 

다음


내가 데이터를 저장하는 데 사용하는 것입니다. 데이터를로드하는 방법은 정반대입니다. 여기
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
GZIPOutputStream gos = new GZIPOutputStream(baos){{ def.setLevel(2);}}; 
BufferedOutputStream bos = new BufferedOutputStream(gos, 16384); 
DataOutputStream dos = new DataOutputStream(bos); 
// Some code writes to dos 
dos.close(); 
byte[cx][cz] = baos.toByteArray(); 
baos.close(); 
cache.put(file, grid); 

그리고


캐시에 대한 선언이다. 나는 자바 스트림 에티켓에 아주 익숙 해요 때문에

private static LinkedHashMap<File, Object> cache = new LinkedHashMap<File, Object>(64, 1.1f, true) 
{protected boolean removeEldestEntry(Map.Entry<File, Object> eldest) 
    { 
     return size() > 64; 
    } 
} 


, 그것은 위의 코드는 실수 보이는 것이 매우 가능성이 높습니다. 버퍼를 넣을 위치와 같은 위의 작업을 효율적으로 수행 할 수있는 방법이 있다고 확신합니다.

어쨌든, 내 주요 문제는 이것입니다 : 하나의 청크에 아무것도 할 필요가 없을 때마다 모든 그리드 데이터를 객체로 변환하여 캐시로 보내고 파일을 써야합니다. 이것은 일을하는 데 매우 비효율적 인 방법입니다. 나는 이것을하기위한 더 좋은 방법이 있는지 알고 싶다. 그래서 나는 얻을 필요가 없다. 그 하나의 청크에 대한 액세스 만 필요할 때 전체 byte [8] [8] [] 배열. 나는 chunk = cache.get [cx] cz와 같은 것을하고 싶지만 그렇게 간단하지는 않을 것이라고 확신한다.

어쨌든, 이전에 말했듯이, 대답이 명백한 경우 질문을 용서해주십시오. 그러나 나는 초저녁입니다. D. 나는 모든 의견을 크게 주셔서 감사합니다.

감사합니다.

답변

1

목표가 I/O 오버 헤드를 줄이려면 byte[][][] 객체를 더티 플래그 개념을 추가하는 래퍼 객체에 두는 것이 어떻습니까?

그런 식으로 수정시 파일이 기록되는 횟수를 줄일 수 있습니다. 캐시를 사용하거나 전체 캐시에 삽입하는 동안 가장 오래된 개체를 제거하려고 할 때 디스크에 더티 개체를 쓰는 것만 가능합니다.

0

데이터를 보유하려면 ByteMatrix3D이라고하는 새 클래스를 만들어야합니다. 그리고 byte[][][]을 사용하는 대신, 계산 된 오프셋이있는 단일 차원 배열을 사용합니다 (예 : 8x8x8 배열에서 [1][2][3]의 오프셋은 1 * 64 + 2 * 8 + 3으로 계산 될 수 있습니다.)이 변경으로 인해 상당히 많은 객체 관리 오버 헤드가 제거되고

첫 번째 변경 사항은 파일에 액세스하기 위해 MappedByteBuffer을 사용하는 것이므로 운영 체제가 실제 데이터를 관리 할 수있게하고, 읽기 및 쓰기를 프로그램에 투명하게 만듭니다.

관련 문제