5个版本

使用旧的Rust 2015

0.1.4 2023年3月4日
0.1.3 2023年3月2日
0.1.2 2023年2月14日
0.1.1 2023年2月12日
0.1.0 2016年12月29日

#594数据库接口

Download history 13/week @ 2024-03-13 23/week @ 2024-03-20 24/week @ 2024-03-27 27/week @ 2024-04-03 63/week @ 2024-04-10 9/week @ 2024-04-17 14/week @ 2024-04-24 12/week @ 2024-05-01 47/week @ 2024-05-08 22/week @ 2024-05-15 21/week @ 2024-05-22 19/week @ 2024-05-29 25/week @ 2024-06-05 78/week @ 2024-06-12 187/week @ 2024-06-19 85/week @ 2024-06-26

379 每月下载量
tstorage 中使用

MIT 许可证

44KB
914

TSZ

Build Status codecov crates.io docs.rs License

文档

一个基于Facebook白皮书《Gorilla:一个快速、可扩展的内存时间序列数据库》的时间序列压缩crate。提供将时间戳和值组成的DataPoint流压缩成字节的函数,以及将字节流解压缩回DataPoint流的函数。

示例

以下是一个如何与tsz交互以编码和解码DataPoint的简单示例。

extern crate tsz;

use std::vec::Vec;
use tsz::{DataPoint, Encode, Decode, StdEncoder, StdDecoder};
use tsz::stream::{BufferedReader, BufferedWriter};
use tsz::decode::Error;

const DATA: &'static str = "1482892270,1.76
1482892280,7.78
1482892288,7.95
1482892292,5.53
1482892310,4.41
1482892323,5.30
1482892334,5.30
1482892341,2.92
1482892350,0.73
1482892360,-1.33
1482892370,-1.78
1482892390,-12.45
1482892401,-34.76
1482892490,78.9
1482892500,335.67
1482892800,12908.12
";

fn main() {
    let w = BufferedWriter::new();

    // 1482892260 is the Unix timestamp of the start of the stream
    let mut encoder = StdEncoder::new(1482892260, w);

    let mut actual_datapoints = Vec::new();

    for line in DATA.lines() {
        let substrings: Vec<&str> = line.split(",").collect();
        let t = substrings[0].parse::<u64>().unwrap();
        let v = substrings[1].parse::<f64>().unwrap();
        let dp = DataPoint::new(t, v);
        actual_datapoints.push(dp);
    }

    for dp in &actual_datapoints {
        encoder.encode(*dp);
    }

    let bytes = encoder.close();
    let r = BufferedReader::new(bytes);
    let mut decoder = StdDecoder::new(r);

    let mut expected_datapoints = Vec::new();

    let mut done = false;
    loop {
        if done {
            break;
        }

        match decoder.next() {
            Ok(dp) => expected_datapoints.push(dp),
            Err(err) => {
                if err == Error::EndOfStream {
                    done = true;
                } else {
                    panic!("Received an error from decoder: {:?}", err);
                }
            }
        };
    }

    println!("actual datapoints: {:?}", actual_datapoints);
    println!("expected datapoints: {:?}", expected_datapoints);
}

依赖关系

~0.4–1MB
~23K SLoC