@@ -53,6 +53,7 @@ use datafusion_physical_expr::EquivalenceProperties;
53
53
use futures:: executor:: block_on;
54
54
use futures:: { lock:: Mutex , Stream , StreamExt , TryFutureExt , TryStreamExt } ;
55
55
use itertools:: Itertools ;
56
+ use lz4_flex:: compress_prepend_size;
56
57
use simd_adler32:: Adler32 ;
57
58
use std:: io:: Error ;
58
59
use std:: {
@@ -1603,32 +1604,45 @@ pub fn write_ipc_compressed<W: Write + Seek>(
1603
1604
arrow_writer. finish ( ) ?;
1604
1605
let ipc_encoded = arrow_writer. into_inner ( ) ?;
1605
1606
1606
- // TODO refactor to compress directly to output buffer and avoid a copy
1607
- let compressed = lz4:: block:: compress ( ipc_encoded, None , true ) ?;
1607
+ let compressed = compress_prepend_size ( ipc_encoded) ;
1608
1608
output. write_all ( & compressed) ?;
1609
-
1610
1609
output
1610
+
1611
+ // lz4 crate impl
1612
+ // // TODO refactor to compress directly to output buffer and avoid a copy
1613
+ // let compressed = lz4::block::compress(ipc_encoded, None, true)?;
1614
+ // output.write_all(&compressed)?;
1615
+ //
1616
+ // output
1611
1617
}
1612
- CompressionCodec :: Lz4Frame ( level ) => {
1618
+ CompressionCodec :: Lz4Frame ( _level ) => {
1613
1619
// write IPC first without compression
1614
1620
let mut buffer = vec ! [ ] ;
1615
1621
let mut arrow_writer = StreamWriter :: try_new ( & mut buffer, & batch. schema ( ) ) ?;
1616
1622
arrow_writer. write ( batch) ?;
1617
1623
arrow_writer. finish ( ) ?;
1618
1624
let ipc_encoded = arrow_writer. into_inner ( ) ?;
1619
1625
1620
- let mut encoder = lz4:: EncoderBuilder :: new ( )
1621
- . content_size ( ipc_encoded. len ( ) as u64 )
1622
- // .block_mode(lz4::BlockMode::Independent)
1623
- // .block_size(BlockSize::Default)
1624
- // .checksum(ContentChecksum::NoChecksum)
1625
- // .block_checksum(BlockChecksum::BlockChecksumEnabled)
1626
- . level ( * level as u32 )
1627
- . build ( & mut * output) ?;
1628
- encoder. write_all ( ipc_encoded. as_slice ( ) ) ?;
1629
- let ( output, result) = encoder. finish ( ) ;
1630
- result?;
1631
- output
1626
+ // compress
1627
+ let mut reader = Cursor :: new ( ipc_encoded) ;
1628
+ let mut wtr = lz4_flex:: frame:: FrameEncoder :: new ( output) ;
1629
+ std:: io:: copy ( & mut reader, & mut wtr) . expect ( "I/O operation failed" ) ;
1630
+ wtr. finish ( ) . unwrap ( )
1631
+
1632
+
1633
+ // lz4 crate version
1634
+ // let mut encoder = lz4::EncoderBuilder::new()
1635
+ // .content_size(ipc_encoded.len() as u64)
1636
+ // // .block_mode(lz4::BlockMode::Independent)
1637
+ // // .block_size(BlockSize::Default)
1638
+ // // .checksum(ContentChecksum::NoChecksum)
1639
+ // // .block_checksum(BlockChecksum::BlockChecksumEnabled)
1640
+ // .level(*level as u32)
1641
+ // .build(&mut *output)?;
1642
+ // encoder.write_all(ipc_encoded.as_slice())?;
1643
+ // let (output, result) = encoder.finish();
1644
+ // result?;
1645
+ // output
1632
1646
}
1633
1647
CompressionCodec :: Zstd ( level) => {
1634
1648
let encoder = zstd:: Encoder :: new ( output, * level) ?;
0 commit comments