Uncompress and merge 24 hours of 100 Hz small waveform from 13 files in 8 seconds
This commit is contained in:
+11
-11
@@ -807,7 +807,7 @@ async fn agg_x_dim_0_inner() {
|
|||||||
let bin_count = 20;
|
let bin_count = 20;
|
||||||
let ts1 = query.timebin as u64 * query.channel_config.time_bin_size;
|
let ts1 = query.timebin as u64 * query.channel_config.time_bin_size;
|
||||||
let ts2 = ts1 + HOUR * 24;
|
let ts2 = ts1 + HOUR * 24;
|
||||||
let fut1 = crate::EventBlobsComplete::new(&query, &node)
|
let fut1 = crate::EventBlobsComplete::new(&query, query.channel_config.clone(), &node)
|
||||||
.into_dim_1_f32_stream()
|
.into_dim_1_f32_stream()
|
||||||
//.take(1000)
|
//.take(1000)
|
||||||
.map(|q| {
|
.map(|q| {
|
||||||
@@ -861,7 +861,7 @@ async fn agg_x_dim_1_inner() {
|
|||||||
let bin_count = 10;
|
let bin_count = 10;
|
||||||
let ts1 = query.timebin as u64 * query.channel_config.time_bin_size;
|
let ts1 = query.timebin as u64 * query.channel_config.time_bin_size;
|
||||||
let ts2 = ts1 + HOUR * 24;
|
let ts2 = ts1 + HOUR * 24;
|
||||||
let fut1 = crate::EventBlobsComplete::new(&query, &node)
|
let fut1 = crate::EventBlobsComplete::new(&query, query.channel_config.clone(), &node)
|
||||||
.into_dim_1_f32_stream()
|
.into_dim_1_f32_stream()
|
||||||
//.take(1000)
|
//.take(1000)
|
||||||
.map(|q| {
|
.map(|q| {
|
||||||
@@ -890,10 +890,6 @@ fn merge_0() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn merge_0_inner() {
|
async fn merge_0_inner() {
|
||||||
let nodes = vec![
|
|
||||||
make_test_node(0),
|
|
||||||
make_test_node(1),
|
|
||||||
];
|
|
||||||
let query = netpod::AggQuerySingleChannel {
|
let query = netpod::AggQuerySingleChannel {
|
||||||
channel_config: ChannelConfig {
|
channel_config: ChannelConfig {
|
||||||
channel: Channel {
|
channel: Channel {
|
||||||
@@ -902,17 +898,21 @@ async fn merge_0_inner() {
|
|||||||
name: "wave1".into(),
|
name: "wave1".into(),
|
||||||
},
|
},
|
||||||
time_bin_size: DAY,
|
time_bin_size: DAY,
|
||||||
shape: Shape::Wave(1024),
|
shape: Shape::Wave(17),
|
||||||
scalar_type: ScalarType::F64,
|
scalar_type: ScalarType::F64,
|
||||||
big_endian: true,
|
big_endian: true,
|
||||||
compression: true,
|
compression: true,
|
||||||
},
|
},
|
||||||
timebin: 0,
|
timebin: 0,
|
||||||
tb_file_count: 1,
|
tb_file_count: 1,
|
||||||
buffer_size: 17,
|
buffer_size: 1024 * 8,
|
||||||
};
|
};
|
||||||
let streams: Vec<_> = nodes.into_iter().map(|node| {
|
let streams = (0..13).into_iter()
|
||||||
crate::EventBlobsComplete::new(&query, &node)
|
.map(|k| {
|
||||||
|
make_test_node(k)
|
||||||
|
})
|
||||||
|
.map(|node| {
|
||||||
|
crate::EventBlobsComplete::new(&query, query.channel_config.clone(), &node)
|
||||||
.into_dim_1_f32_stream()
|
.into_dim_1_f32_stream()
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
@@ -920,7 +920,7 @@ async fn merge_0_inner() {
|
|||||||
.map(|k| {
|
.map(|k| {
|
||||||
//info!("NEXT MERGED ITEM ts {:?}", k.as_ref().unwrap().tss);
|
//info!("NEXT MERGED ITEM ts {:?}", k.as_ref().unwrap().tss);
|
||||||
})
|
})
|
||||||
.fold(0, |k, q| async { 0 })
|
.fold(0, |k, q| ready(0))
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-21
@@ -41,30 +41,24 @@ pub async fn gen_test_data() -> Result<(), Error> {
|
|||||||
},
|
},
|
||||||
time_bin_size: DAY,
|
time_bin_size: DAY,
|
||||||
scalar_type: ScalarType::F64,
|
scalar_type: ScalarType::F64,
|
||||||
shape: Shape::Wave(9),
|
shape: Shape::Wave(17),
|
||||||
big_endian: true,
|
big_endian: true,
|
||||||
compression: true,
|
compression: true,
|
||||||
},
|
},
|
||||||
time_spacing: SEC * 1,
|
time_spacing: MS * 10,
|
||||||
};
|
};
|
||||||
ensemble.channels.push(chn);
|
ensemble.channels.push(chn);
|
||||||
}
|
}
|
||||||
let node0 = Node {
|
for i1 in 0..13 {
|
||||||
host: "localhost".into(),
|
let node = Node {
|
||||||
port: 7780,
|
host: "localhost".into(),
|
||||||
split: 0,
|
port: 7780 + i1,
|
||||||
data_base_path: data_base_path.join("node00"),
|
split: i1 as u8,
|
||||||
ksprefix: ksprefix.clone(),
|
data_base_path: data_base_path.join(format!("node{:02}", i1)),
|
||||||
};
|
ksprefix: ksprefix.clone(),
|
||||||
let node1 = Node {
|
};
|
||||||
host: "localhost".into(),
|
ensemble.nodes.push(node);
|
||||||
port: 7781,
|
}
|
||||||
split: 1,
|
|
||||||
data_base_path: data_base_path.join("node01"),
|
|
||||||
ksprefix: ksprefix.clone(),
|
|
||||||
};
|
|
||||||
ensemble.nodes.push(node0);
|
|
||||||
ensemble.nodes.push(node1);
|
|
||||||
for node in &ensemble.nodes {
|
for node in &ensemble.nodes {
|
||||||
gen_node(node, &ensemble).await?;
|
gen_node(node, &ensemble).await?;
|
||||||
}
|
}
|
||||||
@@ -173,7 +167,7 @@ async fn gen_event(file: &mut File, evix: u64, ts: u64, config: &ChannelConfig)
|
|||||||
match &config.scalar_type {
|
match &config.scalar_type {
|
||||||
ScalarType::F64 => {
|
ScalarType::F64 => {
|
||||||
let ele_size = 8;
|
let ele_size = 8;
|
||||||
let mut vals = vec![0; ele_size * ele_count];
|
let mut vals = vec![0; (ele_size * ele_count) as usize];
|
||||||
for i1 in 0..ele_count {
|
for i1 in 0..ele_count {
|
||||||
let v = evix as f64;
|
let v = evix as f64;
|
||||||
let a = v.to_be_bytes();
|
let a = v.to_be_bytes();
|
||||||
@@ -182,8 +176,8 @@ async fn gen_event(file: &mut File, evix: u64, ts: u64, config: &ChannelConfig)
|
|||||||
c1.seek(SeekFrom::Start(i1 as u64 * ele_size as u64))?;
|
c1.seek(SeekFrom::Start(i1 as u64 * ele_size as u64))?;
|
||||||
std::io::Write::write_all(&mut c1, &a)?;
|
std::io::Write::write_all(&mut c1, &a)?;
|
||||||
}
|
}
|
||||||
let mut comp = vec![0u8; ele_size * ele_count + 64];
|
let mut comp = vec![0u8; (ele_size * ele_count + 64) as usize];
|
||||||
let n1 = bitshuffle_compress(&vals, &mut comp, ele_count, ele_size, 0).unwrap();
|
let n1 = bitshuffle_compress(&vals, &mut comp, ele_count as usize, ele_size as usize, 0).unwrap();
|
||||||
buf.put_u64(vals.len() as u64);
|
buf.put_u64(vals.len() as u64);
|
||||||
let comp_block_size = 0;
|
let comp_block_size = 0;
|
||||||
buf.put_u32(comp_block_size);
|
buf.put_u32(comp_block_size);
|
||||||
|
|||||||
+19
-6
@@ -16,7 +16,7 @@ use tokio::fs::{OpenOptions, File};
|
|||||||
use bytes::{Bytes, BytesMut, Buf};
|
use bytes::{Bytes, BytesMut, Buf};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use bitshuffle::bitshuffle_decompress;
|
use bitshuffle::bitshuffle_decompress;
|
||||||
use netpod::{ScalarType, Node};
|
use netpod::{ScalarType, Shape, Node, ChannelConfig};
|
||||||
|
|
||||||
|
|
||||||
pub async fn read_test_1(query: &netpod::AggQuerySingleChannel, node: &Node) -> Result<netpod::BodyStream, Error> {
|
pub async fn read_test_1(query: &netpod::AggQuerySingleChannel, node: &Node) -> Result<netpod::BodyStream, Error> {
|
||||||
@@ -354,7 +354,7 @@ pub fn parsed1(query: &netpod::AggQuerySingleChannel, node: &netpod::Node) -> im
|
|||||||
match fileres {
|
match fileres {
|
||||||
Ok(file) => {
|
Ok(file) => {
|
||||||
let inp = Box::pin(file_content_stream(file, query.buffer_size as usize));
|
let inp = Box::pin(file_content_stream(file, query.buffer_size as usize));
|
||||||
let mut chunker = EventChunker::new(inp);
|
let mut chunker = EventChunker::new(inp, todo!());
|
||||||
while let Some(evres) = chunker.next().await {
|
while let Some(evres) = chunker.next().await {
|
||||||
match evres {
|
match evres {
|
||||||
Ok(evres) => {
|
Ok(evres) => {
|
||||||
@@ -384,17 +384,19 @@ pub fn parsed1(query: &netpod::AggQuerySingleChannel, node: &netpod::Node) -> im
|
|||||||
|
|
||||||
|
|
||||||
pub struct EventBlobsComplete {
|
pub struct EventBlobsComplete {
|
||||||
|
channel_config: ChannelConfig,
|
||||||
file_chan: async_channel::Receiver<Result<File, Error>>,
|
file_chan: async_channel::Receiver<Result<File, Error>>,
|
||||||
evs: Option<EventChunker>,
|
evs: Option<EventChunker>,
|
||||||
buffer_size: u32,
|
buffer_size: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventBlobsComplete {
|
impl EventBlobsComplete {
|
||||||
pub fn new(query: &netpod::AggQuerySingleChannel, node: &netpod::Node) -> Self {
|
pub fn new(query: &netpod::AggQuerySingleChannel, channel_config: ChannelConfig, node: &netpod::Node) -> Self {
|
||||||
Self {
|
Self {
|
||||||
file_chan: open_files(query, node),
|
file_chan: open_files(query, node),
|
||||||
evs: None,
|
evs: None,
|
||||||
buffer_size: query.buffer_size,
|
buffer_size: query.buffer_size,
|
||||||
|
channel_config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -424,7 +426,7 @@ impl Stream for EventBlobsComplete {
|
|||||||
match k {
|
match k {
|
||||||
Ok(file) => {
|
Ok(file) => {
|
||||||
let inp = Box::pin(file_content_stream(file, self.buffer_size as usize));
|
let inp = Box::pin(file_content_stream(file, self.buffer_size as usize));
|
||||||
let mut chunker = EventChunker::new(inp);
|
let mut chunker = EventChunker::new(inp, self.channel_config.clone());
|
||||||
self.evs.replace(chunker);
|
self.evs.replace(chunker);
|
||||||
continue 'outer;
|
continue 'outer;
|
||||||
}
|
}
|
||||||
@@ -452,7 +454,7 @@ pub fn event_blobs_complete(query: &netpod::AggQuerySingleChannel, node: &netpod
|
|||||||
match fileres {
|
match fileres {
|
||||||
Ok(file) => {
|
Ok(file) => {
|
||||||
let inp = Box::pin(file_content_stream(file, query.buffer_size as usize));
|
let inp = Box::pin(file_content_stream(file, query.buffer_size as usize));
|
||||||
let mut chunker = EventChunker::new(inp);
|
let mut chunker = EventChunker::new(inp, todo!());
|
||||||
while let Some(evres) = chunker.next().await {
|
while let Some(evres) = chunker.next().await {
|
||||||
match evres {
|
match evres {
|
||||||
Ok(evres) => {
|
Ok(evres) => {
|
||||||
@@ -479,6 +481,7 @@ pub struct EventChunker {
|
|||||||
polled: u32,
|
polled: u32,
|
||||||
state: DataFileState,
|
state: DataFileState,
|
||||||
tmpbuf: Vec<u8>,
|
tmpbuf: Vec<u8>,
|
||||||
|
channel_config: ChannelConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum DataFileState {
|
enum DataFileState {
|
||||||
@@ -488,7 +491,7 @@ enum DataFileState {
|
|||||||
|
|
||||||
impl EventChunker {
|
impl EventChunker {
|
||||||
|
|
||||||
pub fn new(inp: Pin<Box<dyn Stream<Item=Result<BytesMut, Error>> + Send>>) -> Self {
|
pub fn new(inp: Pin<Box<dyn Stream<Item=Result<BytesMut, Error>> + Send>>, channel_config: ChannelConfig) -> Self {
|
||||||
let mut inp = NeedMinBuffer::new(inp);
|
let mut inp = NeedMinBuffer::new(inp);
|
||||||
inp.set_need_min(6);
|
inp.set_need_min(6);
|
||||||
Self {
|
Self {
|
||||||
@@ -497,6 +500,7 @@ impl EventChunker {
|
|||||||
polled: 0,
|
polled: 0,
|
||||||
state: DataFileState::FileHeader,
|
state: DataFileState::FileHeader,
|
||||||
tmpbuf: vec![0; 1024 * 1024 * 4],
|
tmpbuf: vec![0; 1024 * 1024 * 4],
|
||||||
|
channel_config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -582,6 +586,9 @@ impl EventChunker {
|
|||||||
let is_array = type_flags & ARRAY != 0;
|
let is_array = type_flags & ARRAY != 0;
|
||||||
let is_big_endian = type_flags & BIG_ENDIAN != 0;
|
let is_big_endian = type_flags & BIG_ENDIAN != 0;
|
||||||
let is_shaped = type_flags & SHAPE != 0;
|
let is_shaped = type_flags & SHAPE != 0;
|
||||||
|
if let Shape::Wave(_) = self.channel_config.shape {
|
||||||
|
assert!(is_array);
|
||||||
|
}
|
||||||
let compression_method = if is_compressed {
|
let compression_method = if is_compressed {
|
||||||
sl.read_u8().unwrap()
|
sl.read_u8().unwrap()
|
||||||
}
|
}
|
||||||
@@ -613,6 +620,12 @@ impl EventChunker {
|
|||||||
let type_size = type_size(type_index);
|
let type_size = type_size(type_index);
|
||||||
let ele_count = value_bytes / type_size as u64;
|
let ele_count = value_bytes / type_size as u64;
|
||||||
let ele_size = type_size;
|
let ele_size = type_size;
|
||||||
|
match self.channel_config.shape {
|
||||||
|
Shape::Wave(ele2) => {
|
||||||
|
assert!(ele2 == ele_count as u32);
|
||||||
|
}
|
||||||
|
_ => panic!(),
|
||||||
|
}
|
||||||
let decomp_bytes = (type_size * ele_count as u32) as usize;
|
let decomp_bytes = (type_size * ele_count as u32) as usize;
|
||||||
let mut decomp = BytesMut::with_capacity(decomp_bytes);
|
let mut decomp = BytesMut::with_capacity(decomp_bytes);
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|||||||
+1
-1
@@ -134,7 +134,7 @@ pub struct ChannelConfig {
|
|||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub enum Shape {
|
pub enum Shape {
|
||||||
Scalar,
|
Scalar,
|
||||||
Wave(usize),
|
Wave(u32),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod timeunits {
|
pub mod timeunits {
|
||||||
|
|||||||
Reference in New Issue
Block a user