Parsing 逐字节搜索文件的正确方法是什么?

Parsing 逐字节搜索文件的正确方法是什么?,parsing,rust,Parsing,Rust,在解析文件时,我需要定位某个值字节。在本例中,我正在搜索值13。我知道这个值将存在于32字节块的开头。根据所有这些信息,我提出了一些类似于以下内容的解决方案: let mut file = File::open("file_to_open").unwrap(); let mut read_array = [0u8;32]; while read_array[0] != 13 { file.read_exact(&mut read_array).unwrap()

在解析文件时,我需要定位某个值字节。在本例中,我正在搜索值
13
。我知道这个值将存在于32字节块的开头。根据所有这些信息,我提出了一些类似于以下内容的解决方案:

let mut file = File::open("file_to_open").unwrap();
let mut read_array = [0u8;32];
while read_array[0] != 13 {
    file.read_exact(&mut read_array).unwrap();
}
[...]
问题是这需要很长时间。例如,运行此代码100000次大约需要9秒。另一方面,如果我将大量数据加载到
Vec
中,然后在内存中搜索,我可以更快地读取数据。但是,该文件很大,如果我一次加载的数据块太大,那么在文件早期发现数据的情况下,读取一个字节一个字节的数据所需的时间会更长。我尝试使用SeekFrom::Current,但向前查找32个字节要比一次读取全部32个字节慢

我唯一的选择是提出一个可接受的块大小并迭代这些块吗

编辑:

以下是我目前最快的实现:

fn get_raw(file: &mut File) -> usize {
    let start_bit= 32;
    let mut iter = 0;
    file.seek(SeekFrom::Start(start_bit)).unwrap();
    let read_size = 32;
    let block_size = read_size * 100;
    let mut my_vec = vec![0u8;block_size];
    while let Ok(n) = file.read(&mut my_vec) {
        if n != block_size {
            break;
        }
        for i in (0..block_size).step_by(read_size) {
            if my_vec[i] == 13 {
                return iter;
            }
            iter += 1;
        }
    }
    panic!("The database is corrupt; this process cannot continue.");
}

1) 在进行基准测试时,您是否记得在发布模式下编译?2) 您可能应该使用
BufReader
读取文件:
让mut file=BufReader::new(file::open(“file_to_open”).unwrap()对于这个特定代码,调试和发布之间的速度差异几乎不存在。我将为此检查BufReader。BufReader大大加快了字节数组方法的速度。然而,与向Vec加载3200字节相比,它的速度仍然只有原来的一半。可能会有帮助我在问题中添加了一些示例代码。示例代码是我能够运行的最快的代码。每当我降低
block_size
时,运行所需的时间就会增加很多。如前所述,运行100000次需要576毫秒。将其更改为
let block_size=read_size*10
会将所需时间增加到约1500毫秒。