我有一個包含100,000行以上的數據文件,每行只包含兩個字段,鍵和值用逗號分開,所有的鍵都是唯一的。我想通過這個文件中的鍵來查詢值。將它加載到地圖是沒有問題的,因爲這會消耗太多的內存(代碼將在嵌入式設備上運行),並且我不想涉及數據庫。我要做到目前爲止預處理在我的電腦文件,即行進行排序,然後使用二進制搜索類似下面的預處理文件:在預處理的大文本文件中搜索一行
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;
}
我覺得還有比這更好的解決方案。任何人都可以給我一些啓示嗎?
如何使用恆定時間排序算法? – Prashant
*「將它加載到地圖是無可爭議的,因爲這會消耗太多內存[...]我到目前爲止所做的是在PC中預處理文件,即對行進行排序,然後使用二進制搜索,如下所示」 *如果您的設備具有足夠的內存來對文件內容進行排序,則它還具有足夠的內存以將其保存在地圖中。 –
@TimothyTruckle我在PC上分類,然後將其複製到設備。 – jfly