데이터 파일이 100,000 개 이상 포함되어 있으며, 각 행에는 키와 값을 쉼표로 분리 한 두 개의 필드 만 있습니다. 모든 키는 고유입니다. 이 파일에서 키 값을 쿼리하고 싶습니다. 맵에로드하는 것은 너무 많은 메모리를 소비하므로 (임베디드 장치에서 코드가 실행 됨) DB가 관련되는 것을 원하지 않기 때문에 문제가되지 않습니다.사전 처리 된 큰 텍스트 파일에서 행을 검색하십시오.
public long findKeyOffset(RandomAccessFile raf, String key)
throws IOException {
int blockSize = 8192;
long fileSize = raf.length();
long min = 0;
long max = (long) fileSize/blockSize;
long mid;
String line;
while (max - min > 1) {
mid = min + (long) ((max - min)/2);
raf.seek(mid * blockSize);
if (mid > 0)
line = raf.readLine(); // probably a partial line
line = raf.readLine();
String[] parts = line.split(",");
if (key.compareTo(parts[0]) > 0) {
min = mid;
} else {
max = mid;
}
}
// find the right line
min = min * blockSize;
raf.seek(min);
if (min > 0)
line = raf.readLine();
while (true) {
min = raf.getFilePointer();
line = raf.readLine();
if (line == null)
break;
String[] parts = line.split(",");
if (line.compareTo(parts[0]) >= 0)
break;
}
raf.seek(min);
return min;
}
내가 이것보다 더 나은 해결책이 있다고 생각 : 내가 지금까지 할 것은 즉, 다음 전처리 된 파일에 아래와 같은 이진 검색을 사용하여 라인을 정렬 전처리 내 PC에있는 파일입니다. 누군가가 내게 깨달음을 줄 수 있습니까?
일정 시간 정렬 알고리즘 사용은 어떻습니까? – Prashant
* "지도에로드하는 것은 너무 많은 메모리를 소비하므로 문제가되지 않습니다. [...] 지금까지 내가 수행 한 작업은 PC에서 파일을 전처리하는 것입니다. 즉, 줄을 정렬 한 다음 아래의" * 장치에 파일 내용을 정렬 할 수있는 충분한 메모리가 있으면지도에 보유 할 수있는 충분한 메모리가 있습니다. –
@TimothyTruckle 필자는 PC에서 그것을 정렬 한 다음 장치로 복사합니다. – jfly