Rust高效数据结构库rrs-succinct的使用,rrs-succinct提供简洁紧凑的数据存储与快速查询功能

use rrs_lib::{HartState, MemAccessSize, Memory};
use rrs_lib::memories::VecMemory;
use rrs_lib::instruction_executor::{InstructionExecutor, InstructionException};
use rrs_lib::instruction_string_outputter::InstructionStringOutputter;

fn simulate_riscv() {
    let mut hart = HartState::new();
    // 内存包含以下指令:
    // lui x2, 0x1234b
    // lui x3, 0xf387e
    // add x1, x2, x3
    let mut mem = VecMemory::new(vec![0x1234b137, 0xf387e1b7, 0x003100b3]);

    hart.pc = 0;

    // InstructionExecutor 实现了 InstructionProcessor。step 函数内部调用
    // process_instruction 并处理更新 PC 等事项。
    let mut executor = InstructionExecutor {
        hart_state: &mut hart,
        mem: &mut mem,
    };

    // 执行第一条指令
    output_disass(&mut executor);
    assert_eq!(executor.step(), Ok(()));
    assert_eq!(executor.hart_state.registers[2], 0x1234b000);

    // 执行第二条指令
    output_disass(&mut executor);
    assert_eq!(executor.step(), Ok(()));
    assert_eq!(executor.hart_state.registers[3], 0xf387e000);

    // 执行第三条指令
    output_disass(&mut executor);
    assert_eq!(executor.step(), Ok(()));
    assert_eq!(executor.hart_state.registers[1], 0x05bc9000);

    // 内存仅包含三条指令,因此下一步将产生获取错误
    assert_eq!(executor.step(), Err(InstructionException::FetchError(0xc)));
}

fn output_disass<M: Memory>(executor: &mut InstructionExecutor<M>) {
    let mut outputter = InstructionStringOutputter { insn_pc: executor.hart_state.pc };
    let insn_bits = executor.mem.read_mem(executor.hart_state.pc, MemAccessSize::Word).unwrap();
    println!("{}", rrs_lib::process_instruction(&mut outputter, insn_bits).unwrap());
}
// 完整示例代码
use rrs_lib::{HartState, MemAccessSize, Memory};
use rrs_lib::memories::VecMemory;
use rrs_lib::instruction_executor::{InstructionExecutor, InstructionException};
use rrs_lib::instruction_string_outputter::InstructionStringOutputter;

fn main() {
    // 初始化 RISC-V 硬件线程状态
    let mut hart = HartState::new();
    
    // 创建内存并加载指令
    // 指令序列:lui x2, 0x1234b; lui x3, 0xf387e; add x1, x2, x3
    let mut mem = VecMemory::new(vec![0x1234b137, 0xf387e1b7, 0x003100b3]);
    
    // 设置程序计数器为起始地址
    hart.pc = 0;

    // 创建指令执行器
    let mut executor = InstructionExecutor {
        hart_state: &mut hart,
        mem: &mut mem,
    };

    println!("开始执行 RISC-V 指令模拟...");

    // 执行第一条指令:lui x2, 0x1234b
    output_disass(&mut executor);
    match executor.step() {
        Ok(()) => println!("寄存器 x2 值: 0x{:x}", executor.hart_state.registers[2]),
        Err(e) => println!("执行错误: {:?}", e),
    }

    // 执行第二条指令:lui x3, 0xf387e
    output_disass(&mut executor);
    match executor.step() {
        Ok(()) => println!("寄存器 x3 值: 0x{:x}", executor.hart_state.registers[3]),
        Err(e) => println!("执行错误: {:?}", e),
    }

    // 执行第三条指令:add x1, x2, x3
    output_disass(&mut executor);
    match executor.step() {
        Ok(()) => println!("寄存器 x1 值: 0x{:x}", executor.hart_state.registers[1]),
        Err(e) => println!("执行错误: {:?}", e),
    }

    // 尝试执行第四条指令(预期错误)
    match executor.step() {
        Ok(()) => println!("意外成功执行"),
        Err(e) => println!("预期错误: {:?}", e),
    }
}

// 输出指令反汇编
fn output_disass<M: Memory>(executor: &mut InstructionExecutor<M>) {
    let mut outputter = InstructionStringOutputter { 
        insn_pc: executor.hart_state.pc 
    };
    
    // 从内存读取指令字
    let insn_bits = executor.mem.read_mem(
        executor.hart_state.pc, 
        MemAccessSize::Word
    ).unwrap();
    
    // 处理指令并输出反汇编结果
    let disassembly = rrs_lib::process_instruction(&mut outputter, insn_bits).unwrap();
    println!("PC: 0x{:x} - {}", executor.hart_state.pc, disassembly);
}

1 回复

Rust高效数据结构库rrs-succinct使用指南

概述

rrs-succinct是一个高效的Rust数据结构库,专注于提供简洁紧凑的数据存储和快速查询功能。该库特别适合处理大规模数据集,在内存使用和查询性能之间取得良好平衡。

主要特性

  • 紧凑的数据表示形式
  • 快速查询操作
  • 支持多种数据结构
  • 内存效率高

安装方法

在Cargo.toml中添加依赖:

[dependencies]
rrs-succinct = "0.1.0"

基本使用方法

1. 位向量(BitVector)使用示例

use rrs_succinct::BitVector;

fn main() {
    // 创建位向量
    let mut bv = BitVector::new();
    
    // 设置位
    bv.set(0, true);
    bv.set(5, true);
    bv.set(10, true);
    
    // 获取位值
    println!("位5的值: {}", bv.get(5)); // 输出: true
    
    // 统计设置位的数量
    println!("设置位总数: {}", bv.rank1(11)); // 输出: 3
}

2. 简洁数组(SuccinctArray)示例

use rrs_succinct::SuccinctArray;

fn main() {
    let data = vec![1, 2, 3, 4, 5, 1, 2, 3];
    
    // 创建简洁数组
    let sa = SuccinctArray::from_vec(&data);
    
    // 访问元素
    println!("索引2的元素: {}", sa.access(2)); // 输出: 3
    
    // 排名查询
    println!("值2在位置5之前的出现次数: {}", sa.rank(2, 5)); // 输出: 1
}

3. 小波矩阵(WaveletMatrix)示例

use rrs_succinct::WaveletMatrix;

fn main() {
    let sequence = vec![3, 2, 1, 3, 2, 1, 3, 2, 1];
    
    // 创建小波矩阵
    let wm = WaveletMatrix::new(&sequence);
    
    // 访问元素
    println!("位置4的元素: {}", wm.access(4)); // 输出: 2
    
    // 排名查询
    println!("值3在前6个元素中的出现次数: {}", wm.rank(3, 6)); // 输出: 2
    
    // 选择查询
    println!("第2个3出现的位置: {}", wm.select(3, 2)); // 输出: 3
}

高级功能

范围查询示例

use rrs_succinct::{WaveletMatrix, Range};

fn main() {
    let data = vec![5, 2, 8, 3, 9, 1, 7, 4, 6];
    let wm = WaveletMatrix::new(&data);
    
    // 查询范围内特定值的出现次数
    let range = Range::new(2, 7); // 索引2到6的范围
    let count = wm.range_rank(3, range);
    println!("值3在范围[2,6]中的出现次数: {}", count);
}

完整示例demo

use rrs_succinct::{BitVector, SuccinctArray, WaveletMatrix, Range};

fn main() {
    println!("=== rrs-succinct 完整使用示例 ===");
    
    // 1. 位向量示例
    println!("\n1. 位向量使用示例:");
    let mut bv = BitVector::new();
    bv.set(0, true);
    bv.set(5, true);
    bv.set(10, true);
    println!("位5的值: {}", bv.get(5));
    println!("设置位总数: {}", bv.rank1(11));
    
    // 2. 简洁数组示例
    println!("\n2. 简洁数组使用示例:");
    let data = vec![1, 2, 3, 4, 5, 1, 2, 3];
    let sa = SuccinctArray::from_vec(&data);
    println!("索引2的元素: {}", sa.access(2));
    println!("值2在位置5之前的出现次数: {}", sa.rank(2, 5));
    
    // 3. 小波矩阵示例
    println!("\n3. 小波矩阵使用示例:");
    let sequence = vec![3, 2, 1, 3, 2, 1, 3, 2, 1];
    let wm = WaveletMatrix::new(&sequence);
    println!("位置4的元素: {}", wm.access(4));
    println!("值3在前6个元素中的出现次数: {}", wm.rank(3, 6));
    println!("第2个3出现的位置: {}", wm.select(3, 2));
    
    // 4. 范围查询示例
    println!("\n4. 范围查询示例:");
    let range_data = vec![5, 2, 8, 3, 9, 1, 7, 4, 6];
    let range_wm = WaveletMatrix::new(&range_data);
    let range = Range::new(2, 7);
    let count = range_wm.range_rank(3, range);
    println!("值3在范围[2,6]中的出现次数: {}", count);
    
    println!("\n=== 示例执行完成 ===");
}

性能建议

  1. 批量操作:尽量使用批量操作而不是单个操作
  2. 预分配内存:如果知道数据大小,预先分配内存
  3. 使用合适的结构:根据查询模式选择最合适的数据结构

注意事项

  • 数据结构构建时间可能较长,但查询效率高
  • 适合读多写少的场景
  • 内存使用虽然紧凑,但构建过程可能需要额外内存

这个库特别适合需要处理大规模数据并且对内存使用有严格要求的应用场景。

回到顶部