#disk #serialization #vector #swap #memory #swapping #length

swapvec

在超过给定长度后将向量交换到磁盘

9 个不稳定版本 (3 个破坏性更新)

0.4.2 2023 年 11 月 29 日
0.4.1 2023 年 11 月 14 日
0.3.0 2023 年 5 月 15 日
0.2.0 2023 年 4 月 23 日
0.1.3 2023 年 4 月 14 日

#460文件系统

Download history 284/week @ 2024-04-23 288/week @ 2024-04-30 446/week @ 2024-05-07 441/week @ 2024-05-14 251/week @ 2024-05-21 256/week @ 2024-05-28 269/week @ 2024-06-04 517/week @ 2024-06-11 341/week @ 2024-06-18 352/week @ 2024-06-25 494/week @ 2024-07-02 345/week @ 2024-07-09 188/week @ 2024-07-16 293/week @ 2024-07-23 212/week @ 2024-07-30 232/week @ 2024-08-06

每月下载量 944
用于 cozo

MIT 协议

25KB
463

SwapVec

当超过一定长度时将向量交换到磁盘的向量。

如果你不想使用队列,而是先收集所有数据,然后消费它们,这会很有用。

想象多个线程缓慢地生成大型数据向量,稍后将其传递给单个消费者。

或者将多个吉字节大小的 CSV 文件上传到 HTTP 服务器,你希望在上传时验证每一行,而不直接开始数据库事务或保留所有数据在内存中。

功能

  • 多平台(Linux、Windows、MacOS)
  • 仅在超过阈值后创建临时文件
  • T: 序列化 + 反序列化 + 克隆 上工作
  • 即使在程序终止时也会删除临时文件
  • 校验和以确保完整性
  • 可以在线程之间移动

限制

  • 由于可能进行 I/O 操作,大多数操作都包含在 Result
  • 目前,尚未实现“在 n MiB 后开始交换”
    • 由于堆元素(例如 String)需要逐元素空间计算
  • Compression 目前不压缩。它存在是为了保持 API 稳定。
  • 没有异步支持(尚无)
  • 在推送元素或消费迭代器时,SwapVec 是“只写”的
  • 只能正向迭代
    • 但可以重置

示例

基本用法

use swapvec::SwapVec;
let iterator = (0..9).into_iter();
let mut much_data = SwapVec::default();
// Starts using disk for big iterators
much_data.consume(iterator).unwrap();
for value in much_data.into_iter() {
    println!("Read back: {}", value.unwrap());
}

示例

目前只有一个简单的示例,执行一些基本操作并获取诸如将批次/字节写入文件的指标。用以下命令运行:

cargo run --example demo

依赖项

~2–11MB
~121K SLoC