- try to use array views

This commit is contained in:
Wim Pomp
2024-10-16 22:14:11 +02:00
parent 9ed901a11a
commit 76046b762e
4 changed files with 13 additions and 11 deletions

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "tiffwrite" name = "tiffwrite"
version = "2024.10.6" version = "2024.10.7"
edition = "2021" edition = "2021"
authors = ["Wim Pomp <w.pomp@nki.nl>"] authors = ["Wim Pomp <w.pomp@nki.nl>"]
license = "GPL-3.0-or-later" license = "GPL-3.0-or-later"

View File

@@ -3,7 +3,7 @@ mod py;
use anyhow::Result; use anyhow::Result;
use chrono::Utc; use chrono::Utc;
use ndarray::{s, Array2}; use ndarray::{s, Array2, ArrayView2};
use num::{traits::ToBytes, Complex, FromPrimitive, Rational32, Zero}; use num::{traits::ToBytes, Complex, FromPrimitive, Rational32, Zero};
use rayon::prelude::*; use rayon::prelude::*;
use std::collections::HashSet; use std::collections::HashSet;
@@ -632,17 +632,18 @@ impl IJTiffFile {
} }
} }
pub fn save<T>(&mut self, frame: Array2<T>, c: usize, z: usize, t: usize) -> Result<()> pub fn save<T>(&mut self, frame: ArrayView2<T>, c: usize, z: usize, t: usize) -> Result<()>
where where
T: Bytes + Clone + Send + Sync + Zero + 'static, T: Bytes + Clone + Send + Zero + 'static,
{ {
self.compress_frame(frame.reversed_axes(), c, z, t)?; self.compress_frame(frame.reversed_axes(), c, z, t)?;
Ok(()) Ok(())
} }
fn compress_frame<T>(&mut self, frame: Array2<T>, c: usize, z: usize, t: usize) -> Result<()> fn compress_frame<T>(&mut self, frame: ArrayView2<T>,
c: usize, z: usize, t: usize) -> Result<()>
where where
T: Bytes + Clone + Zero + Send + 'static, T: Bytes + Clone + Send + Zero + 'static,
{ {
fn compress<T>(frame: Array2<T>, compression_level: i32) -> CompressedFrame fn compress<T>(frame: Array2<T>, compression_level: i32) -> CompressedFrame
where where
@@ -657,7 +658,7 @@ impl IJTiffFile {
) )
.max(16) .max(16)
.min(1024); .min(1024);
let tiles = IJTiffFile::tile(frame.reversed_axes(), tile_size); let tiles = IJTiffFile::tile(frame.view().reversed_axes(), tile_size);
let byte_tiles: Vec<Vec<u8>> = tiles let byte_tiles: Vec<Vec<u8>> = tiles
.into_iter() .into_iter()
.map(|tile| tile.map(|x| x.bytes()).into_iter().flatten().collect()) .map(|tile| tile.map(|x| x.bytes()).into_iter().flatten().collect())
@@ -690,6 +691,7 @@ impl IJTiffFile {
sleep(Duration::from_millis(100)); sleep(Duration::from_millis(100));
} }
let compression_level = self.compression_level; let compression_level = self.compression_level;
let frame = frame.to_owned();
self.threads.insert( self.threads.insert(
(c, z, t), (c, z, t),
thread::spawn(move || compress(frame, compression_level)), thread::spawn(move || compress(frame, compression_level)),
@@ -729,7 +731,7 @@ impl IJTiffFile {
Ok(()) Ok(())
} }
fn tile<T: Clone + Zero>(frame: Array2<T>, size: usize) -> Vec<Array2<T>> { fn tile<T: Clone + Zero>(frame: ArrayView2<T>, size: usize) -> Vec<Array2<T>> {
let shape = frame.shape(); let shape = frame.shape();
let (n, m) = (shape[0] / size, shape[1] / size); let (n, m) = (shape[0] / size, shape[1] / size);
let mut tiles = Vec::new(); let mut tiles = Vec::new();

View File

@@ -12,12 +12,12 @@ fn main() -> Result<()> {
arr[[i, j]] = i as u16; arr[[i, j]] = i as u16;
} }
} }
f.save(arr.to_owned(), 0, 0, 0)?; f.save(arr.view(), 0, 0, 0)?;
let mut arr = Array2::<u16>::zeros((100, 100)); let mut arr = Array2::<u16>::zeros((100, 100));
arr.slice_mut(s![64.., ..64]).fill(1); arr.slice_mut(s![64.., ..64]).fill(1);
arr.slice_mut(s![..64, 64..]).fill(2); arr.slice_mut(s![..64, 64..]).fill(2);
arr.slice_mut(s![64.., 64..]).fill(3); arr.slice_mut(s![64.., 64..]).fill(3);
f.save(arr.to_owned(), 1, 0, 0)?; f.save(arr.view(), 1, 0, 0)?;
Ok(()) Ok(())
} }

View File

@@ -332,7 +332,7 @@ macro_rules! impl_save {
z: usize, z: usize,
) -> PyResult<()> { ) -> PyResult<()> {
if let Some(ijtifffile) = self.ijtifffile.as_mut() { if let Some(ijtifffile) = self.ijtifffile.as_mut() {
ijtifffile.save(frame.to_owned_array(), c, t, z)?; ijtifffile.save(frame.as_array(), c, t, z)?;
} }
Ok(()) Ok(())
} }