【发布时间】:2013-03-05 05:28:30
【问题描述】:
所以我实现了一个使用二进制搜索方法搜索文件的工作程序:
public int BSearch(int x1, int x2) throws IOException {
int current_key;
middle=(x1+x2)/2;
if(x1>x2) {
middle=-1; //middle==-1 is condition of 'key not found'
return middle;
}
MyFile.seek(middle*4);
current_key=MyFile.readInt();
da++;
if(current_key==key) {
return middle;
}
else if(key<current_key) {
x2=middle-1;
return BSearch(x1,x2);
}
else {
x1=middle+1;
return BSearch(x1,x2);
}
}
现在我想对其进行转换,以便将文件逐个(例如每次 1KB)读取到缓冲区中,然后对该缓冲区进行二进制搜索。如果在该缓冲区中找不到密钥,我会进一步读取文件,依此类推。我想澄清一下,缓冲区是这样的手工缓冲区(纠正我):
byte[] buf = new byte[1024];
MyFile.read(buf);
ByteArrayInputStream bis= new ByteArrayInputStream(buf1);
DataInputStream ois= new DataInputStream(bis);
current_key=ois.readInt();
一个大问题(除其他外)是我不知道如何从缓冲区的某个位置读取数据
【问题讨论】:
-
为什么不能直接使用整个文件?
-
这个想法是我想使用小缓冲区,这样我就可以以同样的方式处理大文件(如 5 GB)。当然,我无法将 5GB 读入主内存。
-
我认为不需要将整个文件加载到 RAM 中。您可以简单地使用
seek并读取相关字节。seek函数接受long,它最多可以寻址 8 艾字节,这应该足够了。 -
我想你说的和我现在所做的一样,或者我无法理解你:P。我想这样做的原因是跳过访问磁盘并更多地使用内存,这样更快。我只是不知道如何搜索缓冲区。
-
Arrays.binarySearch(...)怎么样? docs.oracle.com/javase/6/docs/api/java/util/Arrays.html 此外,从算法上讲,一次搜索整个文件会更快,因为当你的块很小时,你的 O(log n) 变成 O(n)。
标签: java file search binary buffer