2014-03-31 2 views
0

긴 시간 리더기, 처음 포스터.처음 실행시 MappedByteBuffer가 느림

바이너리 파일 세트에서 데이터를 빠르게 읽는 데 문제가 있습니다. ByteBuffers 및 MappedBytBuffers는 필자가 요구하는 성능을 제공하지만 워밍업을 위해서는 초기 실행이 필요합니다. 그 때문에 여기에 의미가 일부 코드입니다 있는지 확실하지 않습니다 :

int BUFFERSIZE = 864; 
int DATASIZE = 33663168; 

int pos = 0; 
// Open File channel to get data 
FileChannel channel = new RandomAccessFile(new File(myFile), "r").getChannel(); 

// Set MappedByteBuffer to read DATASIZE bytes from channel 
MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_ONLY, pos, DATASIZE); 

// Set Endianness 
mbb.order(ByteOrder.nativeOrder()); 

ArrayList<Double> ndt = new ArrayList<Double>(); 

// Read doubles from MappedByteBuffer, perform conversion and add to arraylist 
while (pos < DATASIZE) { 
    xf = mbb.getDouble(pos); 
    ndt.add(xf * cnst * 1000d + stt); 
    pos += BUFFERSIZE; 
} 

// Return arraylist 
return ndt; 

그래서이 실행하는 데 약 7 초 정도 걸립니다하지만 난 후 다시 실행하는 경우는 10ms의에 않습니다. 올바른 동작을 설정하려면 초기 실행을해야 할 필요가있는 것 같습니다. 나는이 같은 간단한 일을 수행하여 작동하는 것으로 나타났습니다 :

channel = new RandomAccessFile(new File(mdfFile), "r").getChannel(); 
ByteBuffer buf = ByteBuffer.allocateDirect(DATASIZE); 
channel.read(buf); 
channel.close(); 

이 약 2 초 정도 걸립니다 그리고 난 다음 MappedByteBuffer의 절차를 실행하는 경우는 10ms의의 데이터를 반환합니다. 그 초기화 단계를 없애고 처음으로 10ms 동안 데이터를 읽는 방법을 알아낼 수 없습니다. 나는 '워밍업 (warming up)', JIT 및 JVM에 관한 모든 종류의 것들을 읽었지만 모두 쓸모가 없습니다.

내 질문은 바로 10ms 성능을 얻을 수 있습니까? 아니면 일종의 초기화를해야합니까? 그렇다면 가장 빠른 방법은 무엇입니까?

코드는 약 1,000 개의 매우 큰 파일을 통해 실행되기 때문에 속도가 중요합니다.

감사합니다.

+0

안녕하세요, 처음부터 파일을 읽을 필요가 있습니다 ... – fge

+0

와우, 빠릅니다! 고맙습니다. 처음 읽는 가장 빠른 방법에 대한 아이디어가 있습니까? – jonesds

+0

어, 그게 정말로 당신의 문제에 대한 대답인지는 모르겠지만,'MappedByteBuffer'의'.load()'메서드를 사용하여 매핑을 메모리에로드 할 수 있습니다; 만약 당신이 여러개의 파일을 열어 놓고 백그라운드에서'.load()'할 수 있다면, 시간을 얻을 수있다. – fge

답변

1

나는 그냥 초기화 단계를 제거하는 방법을 알아낼와 10ms의 처음

당신은 할 수있는 데이터를 읽을 수 없습니다. 디스크에서 데이터를 읽어야합니다. 그것은 10ms보다 오래 걸립니다. 10ms는 이미 메모리에있는 다른 모든 시간을위한 것입니다.

관련 문제