Rust数据分块存储UI库re_chunk_store_ui的使用,高效管理分块数据存储与可视化

Rust数据分块存储UI库re_chunk_store_ui的使用,高效管理分块数据存储与可视化

简介

re_chunk_store_ui是rerun系列crate的一部分,提供了一个用于数据存储的UI界面。

安装

在项目目录中运行以下Cargo命令:

cargo add re_chunk_store_ui

或者在Cargo.toml中添加以下行:

re_chunk_store_ui = "0.24.1"

使用示例

原始示例展示如何使用re_chunk_store_ui来管理分块数据存储和可视化:

use re_chunk_store_ui::ChunkStoreUi;
use rerun::external::re_log_types::DataTable;

fn main() {
    // 1. 创建数据表
    let mut data_table = DataTable::default();
    
    // 2. 添加一些示例数据
    data_table.add_row("row1", &["value1", "value2"]);
    data_table.add_row("row2", &["value3", "value4"]);
    
    // 3. 初始化UI
    let ui = ChunkStoreUi::new();
    
    // 4. 将数据表添加到UI中
    ui.add_data_table("example_table", data_table);
    
    // 5. 运行UI
    ui.run().expect("Failed to run UI");
}

完整示例demo

以下是一个更完整的示例,展示如何创建分块数据并使用UI进行管理:

use re_chunk_store_ui::ChunkStoreUi;
use rerun::external::re_log_types::{DataTable, DataRow};

fn main() {
    // 1. 创建多个数据表
    let mut table1 = DataTable::default();
    let mut table2 = DataTable::default();
    
    // 2. 填充数据表1
    table1.add_row("row1", &["data1", "data2"]);
    table1.add_row("row2", &["data3", "data4"]);
    
    // 3. 填充数据表2
    table2.add_row("rowA", &["valueA", "valueB"]);
    table2.add_row("rowB", &["valueC", "valueD"]);
    
    // 4. 初始化UI
    let ui = ChunkStoreUi::new();
    
    // 5. 添加数据表到UI
    ui.add_data_table("table1", table1);
    ui.add_data_table("table2", table2);
    
    // 6. 运行UI界面
    ui.run().expect("UI运行失败");
}

功能特性

  • 提供数据存储的可视化界面
  • 支持分块数据管理
  • 与rerun生态系统集成

文档

更多详细用法请参考官方文档。

许可证

本库采用MIT或Apache-2.0双许可证。


1 回复

Rust数据分块存储UI库re_chunk_store_ui使用指南

完整示例代码

下面是一个结合了基本使用、UI可视化和自定义分块策略的完整示例:

use re_chunk_store_ui::{ChunkStore, ChunkStoreConfig, ChunkStoreUI, ChunkingStrategy};
use eframe::egui;

// 自定义分块策略:按特定分隔符分块
fn custom_chunking_strategy(data: &[u8]) -> Vec<Vec<u8>> {
    data.split(|&b| b == 0)  // 以0字节作为分隔符
        .map(|slice| slice.to_vec())
        .collect()
}

fn main() -> eframe::Result<()> {
    // 配置分块存储
    let config = ChunkStoreConfig {
        chunk_size: 1024,   // 每个分块1KB
        max_chunks: 10000,  // 最多10000个分块
        ..Default::default()
    };

    // 创建分块存储实例
    let mut store = ChunkStore::new(config);
    
    // 设置自定义分块策略
    store.set_chunking_strategy(ChunkingStrategy::Custom(Box::new(custom_chunking_strategy)));
    
    // 添加示例数据
    let sample_data = vec![
        vec![1, 2, 0, 3, 4, 0, 5],  // 将被分成3块
        vec![10, 20, 30, 40, 50],   // 将被分成1块
        vec![0, 0, 100, 0, 200],    // 将被分成3块
    ];
    
    for data in sample_data {
        store.add_data(&data).unwrap();
    }
    
    // 启用性能监控
    store.enable_metrics(true);

    // 创建UI应用
    let options = eframe::NativeOptions::default();
    eframe::run_native(
        "分块存储管理器",
        options,
        Box::new(|_cc| Box::new(ChunkStoreApp::new(store))),
    )
}

struct ChunkStoreApp {
    store: ChunkStore,
    ui: ChunkStoreUI,
}

impl ChunkStoreApp {
    fn new(store: ChunkStore) -> Self {
        Self {
            store,
            ui: ChunkStoreUI::default(),
        }
    }
}

impl eframe::App for ChunkStoreApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            // 显示库提供的默认UI
            self.ui.ui(ui, &mut self.store);
            
            ui.separator();
            
            // 添加自定义UI部分
            self.custom_ui(ui);
            
            // 显示性能指标
            if let Some(metrics) = self.store.get_metrics() {
                ui.collapsing("性能指标", |ui| {
                    ui.label(format!("总块数: {}", metrics.total_chunks));
                    ui.label(format!("内存使用: {} KB", metrics.memory_usage / 1024));
                    ui.label(format!("平均块大小: {} 字节", metrics.average_chunk_size));
                });
            }
        });
    }
}

impl ChunkStoreApp {
    fn custom_ui(&mut self, ui: &mut egui::Ui) {
        ui.heading("自定义分块管理");
        
        // 显示分块详细信息的表格
        egui::ScrollArea::vertical().show(ui, |ui| {
            egui::Grid::new("chunk_details_grid")
                .num_columns(3)
                .striped(true)
                .show(ui, |ui| {
                    ui.strong("ID");
                    ui.strong("大小");
                    ui.strong("前5字节");
                    ui.end_row();
                    
                    for (id, chunk) in self.store.iter_chunks().enumerate() {
                        ui.label(format!("{}", id));
                        ui.label(format!("{} 字节", chunk.len()));
                        
                        // 显示前5个字节(如果有的话)
                        let preview = if chunk.len() > 5 {
                            format!("{:?}", &chunk[..5])
                        } else {
                            format!("{:?}", chunk)
                        };
                        ui.label(preview);
                        ui.end_row();
                    }
                });
        });
        
        // 添加控制按钮
        ui.horizontal(|ui| {
            if ui.button("压缩存储").clicked() {
                self.store.compact();
            }
            
            if ui.button("清除所有块").clicked() {
                self.store.clear();
            }
            
            if ui.button("添加测试数据").clicked() {
                let test_data = vec![0, 1, 2, 3, 0, 4, 5, 6, 0, 7];
                self.store.add_data(&test_data).unwrap();
            }
        });
    }
}

示例说明

  1. 初始化配置

    • 创建了分块存储配置,指定每个分块大小为1KB,最多10000个分块
    • 设置了自定义的分块策略(按0字节分隔)
  2. 数据操作

    • 添加了几组示例数据
    • 启用了性能监控功能
  3. UI实现

    • 结合了库自带的UI组件
    • 添加了自定义UI部分,显示分块详细信息表格
    • 实现了分块预览功能(显示前5个字节)
    • 添加了控制按钮(压缩、清除、添加测试数据)
  4. 性能监控

    • 在UI中展示了存储的性能指标

运行效果

运行此程序后,你将看到一个包含以下内容的窗口:

  • 库自带的存储管理UI
  • 自定义的分块详细信息表格
  • 性能指标折叠面板
  • 底部控制按钮栏

这个示例展示了如何将re_chunk_store_ui的核心功能与自定义UI相结合,创建一个功能完整的分块数据管理工具。

回到顶部