5 个版本

0.1.4 2023年4月16日
0.1.3 2023年2月25日
0.1.2 2022年1月11日
0.1.1 2022年1月9日
0.1.0 2022年1月8日

#233算法

Download history 329/week @ 2024-03-14 831/week @ 2024-03-21 1148/week @ 2024-03-28 1096/week @ 2024-04-04 1254/week @ 2024-04-11 818/week @ 2024-04-18 1291/week @ 2024-04-25 2278/week @ 2024-05-02 1357/week @ 2024-05-09 1400/week @ 2024-05-16 1893/week @ 2024-05-23 1806/week @ 2024-05-30 1998/week @ 2024-06-06 2206/week @ 2024-06-13 1939/week @ 2024-06-20 991/week @ 2024-06-27

7,489 每月下载量
22 个 crate(7 个直接) 中使用

Unlicense 协议

47KB
993

Crates.io License Test Status Documentation

Rust 外部排序

ext-sort 是一个 Rust 外部排序算法实现。

外部排序是一类可以处理大量数据的排序算法。当待排序的数据不适合计算机的主内存(RAM)而必须存储在较慢的外部存储器(通常为硬盘驱动器)中时,就需要外部排序。排序过程分为两步。在第一步中,它对适合 RAM 的数据块进行排序,在第二步中,它将排序后的数据块合并在一起。更多信息请参阅 外部排序

概述

ext-sort 支持以下功能

  • 数据无关性:它默认支持所有实现 serde 序列化/反序列化的数据类型,否则您可以实现自己的序列化/反序列化机制。
  • 序列化格式无关性:该库默认使用 MessagePack 序列化格式,但可以在不满足任务需求的情况下,轻松地替换为您自定义的格式。
  • 多线程支持:支持多线程排序,这意味着数据将在多个线程中排序,充分利用 CPU 资源并减少排序时间。
  • 内存限制支持:支持内存限制排序。这允许您限制排序内存消耗(需要 memory-limit 功能)。

基本示例

在 Cargo.toml 中激活 ext-sort crate 的 memory-limit 功能

[dependencies]
ext-sort = { version = "^0.1.4", features = ["memory-limit"] }
use std::fs;
use std::io::{self, prelude::*};
use std::path;

use bytesize::MB;
use env_logger;
use log;

use ext_sort::{buffer::mem::MemoryLimitedBufferBuilder, ExternalSorter, ExternalSorterBuilder};

fn main() {
    env_logger::Builder::new().filter_level(log::LevelFilter::Debug).init();

    let input_reader = io::BufReader::new(fs::File::open("input.txt").unwrap());
    let mut output_writer = io::BufWriter::new(fs::File::create("output.txt").unwrap());

    let sorter: ExternalSorter<String, io::Error, MemoryLimitedBufferBuilder> = ExternalSorterBuilder::new()
        .with_tmp_dir(path::Path::new("./"))
        .with_buffer(MemoryLimitedBufferBuilder::new(50 * MB))
        .build()
        .unwrap();

    let sorted = sorter.sort(input_reader.lines()).unwrap();

    for item in sorted.map(Result::unwrap) {
        output_writer.write_all(format!("{}\n", item).as_bytes()).unwrap();
    }
    output_writer.flush().unwrap();
}

依赖项

~4–14MB
~180K SLoC