#batch #split #distribute #optimization #partition #distributed-systems

rsbatch-maestro

一个用于灵活的批量拆分和管理的Rust库,具有各种策略。

2个版本

0.2.1 2024年7月28日
0.2.0 2024年7月28日

#297算法

Download history 126/week @ 2024-07-22 136/week @ 2024-07-29

262 每月下载量

MIT 许可证

25KB
247

RSBatch Maestro

一个用于灵活的批量拆分和管理的Rust库,具有各种策略。

特性

  • 总量的批量平均和不等分
  • 按计数、余数或基于权重进行拆分
  • 基于范围的拆分和优化
  • 强制最小批量大小
  • 批量合并和重新平衡
  • 处理边缘情况并提供有意义的错误

安装

将其添加到您的 Cargo.toml

[dependencies]
rsbatch-maestro = "0.2.0"

用法

use rsbatch_maestro::even_split;

fn main() {
    match even_split(128, 8) {
        Ok((num_batches, batch_sizes)) => {
            println!("Number of batches: {}", num_batches);
            println!("Batch sizes: {:?}", batch_sizes);
        },
        Err(e) => println!("Error: {}", e),
    }
}

API

该库提供了以下功能

pub fn even_split(total: usize, max_batch_size: usize) -> Result<(usize, Vec<NonZeroUsize>), String>
pub fn uneven_split(total: usize, max_batch_size: usize) -> Result<(usize, Vec<NonZeroUsize>), String>
pub fn split_by_count(total: usize, num_batches: usize) -> Result<Vec<NonZeroUsize>, String>
pub fn split_with_remainder(total: usize, batch_size: usize) -> Result<(Vec<NonZeroUsize>, usize), String>
pub fn split_weighted(total: usize, weights: Vec<usize>) -> Result<Vec<NonZeroUsize>, String>
pub fn split_range(total: usize, min_batch_size: usize, max_batch_size: usize) -> Result<Vec<(usize, usize)>, String>
pub fn optimize_split(total: usize, min_batches: usize, max_batches: usize) -> Result<(usize, Vec<NonZeroUsize>), String>
pub fn split_with_min_batch(total: usize, max_batch_size: usize, min_batch_size: usize) -> Result<(usize, Vec<NonZeroUsize>), String>
pub fn split_to_nearest(total: usize, target_batch_size: usize) -> Result<(usize, Vec<NonZeroUsize>), String>
pub fn merge_batches(batches: Vec<NonZeroUsize>, merge_count: usize) -> Result<Vec<NonZeroUsize>, String>
pub fn rebalance_batches(batches: Vec<NonZeroUsize>) -> Vec<NonZeroUsize>

有关每个函数的详细文档,请参阅API文档

示例

use rsbatch_maestro::*;
use std::num::NonZeroUsize;

// Even split
assert_eq!(even_split(50, 8), Ok((10, vec![NonZeroUsize::new(5).unwrap(); 10])));

// Uneven split
assert_eq!(uneven_split(50, 8), Ok((7, vec![NonZeroUsize::new(8).unwrap(); 6].into_iter().chain(vec![NonZeroUsize::new(2).unwrap()]).collect())));

// Split by count
assert_eq!(split_by_count(50, 8), Ok(vec![NonZeroUsize::new(7).unwrap(); 2].into_iter().chain(vec![NonZeroUsize::new(6).unwrap(); 6]).collect()));

// Split with remainder
assert_eq!(split_with_remainder(50, 8), Ok((vec![NonZeroUsize::new(8).unwrap(); 6], 2)));

// Split weighted
assert_eq!(split_weighted(100, vec![1, 2, 3, 4]), Ok(vec![NonZeroUsize::new(10).unwrap(), NonZeroUsize::new(20).unwrap(), NonZeroUsize::new(30).unwrap(), NonZeroUsize::new(40).unwrap()]));

// More examples for other functions can be found in the API documentation

用例

Batch Maestro功能丰富,可用于各种场景

  1. 任务分配:在并行处理系统中将任务分配给工作线程。
  2. 负载均衡:将网络流量或数据库查询分配到多个服务器。
  3. 资源分配:在不同进程或用户之间分配资源(例如,内存、磁盘空间)。
  4. 库存管理:将库存项目分配到不同的存储位置或运输中。
  5. 时间管理:将总时间持续时间分割成段,用于日程安排或时间表。
  6. 金融应用:将金额分割用于预算或投资目的。
  7. 数据分区:将大型数据集分割用于分布式处理或存储。
  8. 批量处理:为任何类型的批量处理操作创建批量。
  9. UI/UX设计:在用户界面中分配元素,如网格布局或菜单项。
  10. 教育应用:为小组项目或活动创建学生组。

许可证

该项目受MIT许可证许可 - 请参阅LICENSE文件以获取详细信息。

贡献

欢迎贡献!请随时提交拉取请求。

  1. 分支项目
  2. 创建您的功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交您的更改 (git commit -m '添加一些惊人的功能')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开一个拉取请求

请确保根据需要更新测试。

版本控制

我们使用SemVer进行版本控制。有关可用版本,请参阅此存储库的标签

作者

有关参与此项目的贡献者列表,请参阅。

致谢

  • 受在各个领域对高效和灵活的资源分配需求的启发。
  • 感谢Rust社区提供的优秀工具和库。

变更日志

有关我们的发布详情,请参阅变更日志

无运行时依赖