2009-12-16 6 views
3

사용중인 라이브러리를 일부 변경하는 중입니다. 메모리 사용을 줄이기 위해 라이브러리는 임시 데이터를 메모리에 보관하는 대신 디스크에 씁니다. 그러나 내 사용 시나리오의 경우 메모리에 보관하는 것이 더 효율적입니다. 또한 임시 파일에 대한 상수 이름을 가지므로 스레드가 서로의 데이터를 손상시킬 수 있으므로 여러 스레드에서 동시에 실행할 수 없으므로 동시성 문제가 발생합니다.Java의 FileChannel 메모리 내장 버전

따라서 모든 데이터가 메모리에 유지되도록 라이브러리를 변경해야합니다. 필자는 원래 라이브러리를 작성하지 않았기 때문에 코드를 크게 변경하는 데 익숙하지 않습니다. 따라서 나는 가능한 한 리팩토링을 거의하지 않고이 작업을하고 싶습니다. 디스크에 쓰는 코드는 아주 간단합니다.

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

블록의 판독 (즉 그것은 그것으로부터 얻는 RandomAccessFile의되는 FileChannel을 사용)와 매우 유사하다 : 여기 (다소 단순화 된) 실시 예이다.

FileChannel의 일부 구현을 사용할 수 있다면 가장 쉬운 해결책이 될 것입니다. FileChannel은 파일 대신 메모리의 위치에 매핑됩니다. FileChannel의 map-method를 사용하여 파일을 메모리의 한 위치에 매핑 할 수 있다는 것을 알고 있습니다. 그러나, 그것은 다른 방향입니다. 그게 나에게 파일에 "메모리 API"를 준다. 일부 메모리에 대해 FileChannel 인터페이스가 필요합니다. 이것에 대한 구현이 있습니까?

답변

2

자바 7은 플러그 형 파일 시스템을 허용하므로 메모리 기반 파일 시스템을 사용하고 현재 FileChannel API를 유지할 수 있습니다. Adrian이 메모리 전용 구조를 제안하거나 사용함에 따라 사용하는 API를 Commons-VFS로 변경해야 할 것 같지 않습니다.

관련 문제