2013-03-16 3 views
0

Так что я реализованный рабочую программу, которая ищет файл с помощью метода двоичного поиска:Двоичный поиск в буфере

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); 
    } 
} 

Теперь я хочу, чтобы преобразовать его, чтобы он читает файл сдельного по-части (скажем, 1 КБ каждый раз) в буфер, а затем двоичный поиск этого буфера. Если ключ не найден в этом буфере, я читаю далее файл и так далее. Я хочу уточнить, однако, что буфер является ручной буфер, как это (поправьте меня):

byte[] buf = new byte[1024]; 
MyFile.read(buf); 
ByteArrayInputStream bis= new ByteArrayInputStream(buf1); 
DataInputStream ois= new DataInputStream(bis); 
current_key=ois.readInt(); 

Большая проблема (среди прочих), я не знаю, как я буду читать с определенной позиции из buffer

+0

И почему вы не можете использовать весь файл? –

+0

Идея состоит в том, что я хочу использовать небольшие буферы, чтобы я мог обрабатывать большие файлы (например, 5 ГБ) одинаково. Конечно, я не смогу прочитать 5 ГБ в основной памяти. – xouris

+0

Не думаю, что весь файл должен быть загружен в ОЗУ. Вы можете просто использовать 'seek' и читать соответствующие байты. Функция 'seek' принимает' long', которая может содержать до 8 экзабайт, которых должно быть достаточно. –

ответ

0

OK Я думаю, мне удалось это сделать, скопировав буфер на новый массив int [] по-элементу. Я хочу верить, что он все же быстрее, чем доступ к диску, каждый раз, когда я хочу загрузить буфер.

Смежные вопросы