@@ -482,17 +482,39 @@ impl<T, E> ResultSwap<T, E> for Result<T, E> {
482482
483483#[ cfg( feature = "diff" ) ]
484484fn gen_delta ( orig : & Path , new : & Path , patch : & Path ) -> Result < ( ) , std:: io:: Error > {
485+ use std:: io:: Read ;
486+ let baseline = memory_stats:: memory_stats ( ) . unwrap ( ) . physical_mem ;
487+
485488 let orig = OpenOptions :: new ( ) . read ( true ) . open ( orig) . unwrap ( ) ;
486- let mut orig = zstd:: Decoder :: new ( orig) ?;
489+ let mut origb = Vec :: new ( ) ;
490+ zstd:: Decoder :: new ( orig) ?. read_to_end ( & mut origb) ?;
491+ let mut origb = Cursor :: new ( origb) ;
492+
487493 let new = OpenOptions :: new ( ) . read ( true ) . open ( new) . unwrap ( ) ;
488- let mut new = zstd:: Decoder :: new ( new) ?;
494+ let mut newb = Vec :: new ( ) ;
495+ zstd:: Decoder :: new ( new) ?. read_to_end ( & mut newb) ?;
496+ let mut newb = Cursor :: new ( newb) ;
489497
490498 let patch = OpenOptions :: new ( ) . write ( true ) . create ( true ) . open ( patch) . unwrap ( ) ;
491499 let mut patch = zstd:: Encoder :: new ( patch, 22 ) ?;
492500
493- ddelta:: generate_chunked ( & mut orig, & mut new, & mut patch, None , |p| debug ! ( "{p:?}" ) ) . unwrap ( ) ;
501+ let before = memory_stats:: memory_stats ( ) . unwrap ( ) . physical_mem ;
502+ let mut max = before;
503+ ddelta:: generate_chunked ( & mut origb, & mut newb, & mut patch, None , |p| {
504+ debug ! ( "{p:?}" ) ;
505+ max = max. max ( memory_stats:: memory_stats ( ) . unwrap ( ) . physical_mem )
506+ } )
507+ . unwrap ( ) ;
494508 patch. do_finish ( ) ?;
495509
510+ let origb = origb. into_inner ( ) ;
511+ let newb = newb. into_inner ( ) ;
512+
513+ debug ! ( "initial memory usage: {before}" ) ;
514+ debug ! ( "maximum memory usage: {max}" ) ;
515+ debug ! ( "origb: {}, newb: {}" , origb. len( ) , newb. len( ) ) ;
516+ debug ! ( "baseline: {baseline}" ) ;
517+ debug ! ( "adduse: {}" , max - origb. len( ) - newb. len( ) - baseline) ;
496518 Ok ( ( ) )
497519}
498520
0 commit comments