#排序 #外部 #IO读取

extsort

在外部排序(即在磁盘上排序)能力上对任意大小的迭代器进行操作

9个不稳定版本

0.5.0 2024年3月25日
0.4.2 2021年2月5日
0.4.0 2020年12月23日
0.3.0 2020年2月8日
0.1.3 2018年12月8日

#229算法

Download history 297/week @ 2024-04-06 289/week @ 2024-04-13 163/week @ 2024-04-20 261/week @ 2024-04-27 205/week @ 2024-05-04 197/week @ 2024-05-11 173/week @ 2024-05-18 89/week @ 2024-05-25 102/week @ 2024-06-01 88/week @ 2024-06-08 135/week @ 2024-06-15 97/week @ 2024-06-22 278/week @ 2024-06-29 221/week @ 2024-07-06 115/week @ 2024-07-13 232/week @ 2024-07-20

每月855次下载
用于 7 个crate(4个直接使用)

Apache-2.0

31KB
544 行代码

extsort

crates.io dependency status

提供外部排序(即在磁盘上排序)能力,即使在迭代器生成的内容不适合内存的情况下也能工作。排序完成后,返回一个新的排序迭代器。

为了保持所有实现的效率,该crate不处理序列化,而是将此任务留给用户。

排序器可以选择使用 rayon 对内存缓冲区进行排序。当缓冲区足够大以影响并行化的开销时,通常更快。

示例

extern crate extsort;
extern crate byteorder;

use extsort::*;
use byteorder::{ReadBytesExt, WriteBytesExt};
use std::io::{Read, Write};

#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
struct MyStruct(u32);

impl Sortable for MyStruct {
    fn encode<W: Write>(&self, write: &mut W) -> std::io::Result<()> {
        write.write_u32::<byteorder::LittleEndian>(self.0)?;
        Ok(())
    }

    fn decode<R: Read>(read: &mut R) -> std::io::Result<MyStruct> {
        read.read_u32::<byteorder::LittleEndian>().map(MyStruct)
    }
}

fn main() {
    let sorter = ExternalSorter::new();
    let reversed_data = (0..1000).rev().map(MyStruct).into_iter();
    let sorted_iter = sorter.sort(reversed_data).unwrap();
    let sorted_data = sorted_iter.collect::<std::io::Result<Vec<MyStruct>>>().unwrap();

    let expected_data = (0..1000).map(MyStruct).collect::<Vec<MyStruct>>();
    assert_eq!(sorted_data, expected_data);
}

依赖项

~3–12MB
~140K SLoC