]>
git.proxmox.com Git - proxmox-backup.git/blob - examples/test_chunk_size.rs
1 extern crate proxmox_backup
;
3 // also see https://www.johndcook.com/blog/standard_deviation/
6 use std
::io
::{Read, Write}
;
8 use proxmox_backup
::backup
::*;
25 fn new(chunk_size
: usize) -> Self {
27 chunker
: Chunker
::new(chunk_size
),
39 fn record_stat(&mut self, chunk_size
: f64) {
41 self.chunk_count
+= 1;
43 if self.chunk_count
== 1 {
44 self.m_old
= chunk_size
;
45 self.m_new
= chunk_size
;
48 self.m_new
= self.m_old
+ (chunk_size
- self.m_old
)/(self.chunk_count
as f64);
49 self.s_new
= self.s_old
+
50 (chunk_size
- self.m_old
)*(chunk_size
- self.m_new
);
51 // set up for next iteration
52 self.m_old
= self.m_new
;
53 self.s_old
= self.s_new
;
56 let variance
= if self.chunk_count
> 1 {
57 self.s_new
/((self.chunk_count
-1)as f64)
60 let std_deviation
= variance
.sqrt();
61 let deviation_per
= (std_deviation
*100.0)/self.m_new
;
62 println
!("COUNT {:10} SIZE {:10} MEAN {:10} DEVIATION {:3}%", self.chunk_count
, chunk_size
, self.m_new
as usize, deviation_per
as usize);
66 impl Write
for ChunkWriter
{
68 fn write(&mut self, data
: &[u8]) -> std
::result
::Result
<usize, std
::io
::Error
> {
70 let chunker
= &mut self.chunker
;
72 let pos
= chunker
.scan(data
);
75 self.chunk_offset
+= pos
;
77 let chunk_size
= self.chunk_offset
- self.last_chunk
;
79 self.record_stat(chunk_size
as f64);
81 self.last_chunk
= self.chunk_offset
;
85 self.chunk_offset
+= data
.len();
90 fn flush(&mut self) -> std
::result
::Result
<(), std
::io
::Error
> {
95 fn main() -> Result
<(), Error
> {
97 let mut file
= std
::fs
::File
::open("/dev/urandom")?
;
101 let mut buffer
= [0u8; 64*1024];
103 let mut writer
= ChunkWriter
::new(4096*1024);
107 file
.read_exact(&mut buffer
)?
;
108 bytes
+= buffer
.len();
110 writer
.write_all(&buffer
)?
;
112 if bytes
> 1024*1024*1024 { break; }