저는 자바 프로그래밍에 익숙하지 않으므로 제게 새로운 질문을 용서해주십시오 :).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. 나는 모든 의견을 크게 주셔서 감사합니다.
감사합니다.