我有一个包含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