문제

나는 내가 사용하는 라이브러리를 약간 변경하는 중입니다. 메모리 사용을 줄이기 위해 라이브러리는 메모리에 유지하는 대신 임시 데이터를 디스크에 작성하고 있습니다. 그러나 사용 시나리오의 경우 메모리를 유지하는 것이 더 효율적입니다. 또한 온도 파일에 대한 이름이 상당히 유지되므로 다른 스레드에서 동시에 실행할 수 없기 때문에 동시성 문제가 있습니다 (스레드가 서로의 데이터를 손상시키기 때문에).

따라서 모든 데이터를 메모리에 유지하도록 라이브러리를 변경해야합니다. 나는 원래 도서관을 작성하지 않았으므로 코드를 급격히 변경하는 데별로 편하지 않습니다. 따라서 가능한 한 리팩토링이 거의없는 상태 에서이 작업을 수행하고 싶습니다. 디스크에 쓰는 코드는 매우 간단합니다. 다음은 (다소 단순화 된) 예입니다.

final FileChannel fileChannel = this.randomAccessFile.getChannel();
fileChannel.position(calculatePosition());
while (blockData.hasRemaining())
{
 fileChannel.write(blockData);
}

블록의 판독은 매우 유사합니다 (즉, FilEchannel을 사용하여 RandomAccessFile에서 얻습니다).

파일 대신 메모리의 위치에 맵핑되는 Filechannel 구현을 사용할 수 있다면 가장 쉬운 솔루션이 느껴집니다. FilEchannel의 맵 메드를 사용하여 파일을 메모리의 장소에 매핑 할 수 있다는 것을 알고 있습니다. 그러나 그것은 다른 방법입니다. 그것은 나에게 파일에 "memory-api"를 제공합니다. 나는 메모리에 대해 filechannel-interface를 원합니다. 이것의 사용 가능한 구현이 있습니까?

도움이 되었습니까?

해결책

Java 7은 플러그 가능한 파일 시스템을 허용하므로 메모리 기반 파일 시스템을 사용하고 현재 Filechannel API를 유지할 수 있습니다. 아드리안이 제안하거나 메모리 전용 구조를 사용하는 것처럼 Commons-VFS로 사용하는 API를 변경해야 할 수도 있습니다.

다른 팁

아마도 당신은 아파치 커먼즈 VFS.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top