긴 시간 리더기, 처음 포스터.처음 실행시 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 개의 매우 큰 파일을 통해 실행되기 때문에 속도가 중요합니다.
감사합니다.
안녕하세요, 처음부터 파일을 읽을 필요가 있습니다 ... – fge
와우, 빠릅니다! 고맙습니다. 처음 읽는 가장 빠른 방법에 대한 아이디어가 있습니까? – jonesds
어, 그게 정말로 당신의 문제에 대한 대답인지는 모르겠지만,'MappedByteBuffer'의'.load()'메서드를 사용하여 매핑을 메모리에로드 할 수 있습니다; 만약 당신이 여러개의 파일을 열어 놓고 백그라운드에서'.load()'할 수 있다면, 시간을 얻을 수있다. – fge