[Insight-developers] HDF5 writer streaming
Bradley Lowekamp
blowekamp at mail.nih.gov
Mon Dec 30 08:05:13 EST 2013
This article may be of some use too:
http://www.insight-journal.org/browse/publication/729
On Dec 30, 2013, at 1:40 AM, David Froger <david.froger at inria.fr> wrote:
> Hi all,
>
> I would like to add writer streaming support to the HDF5 module. Writer
> streaming would includes:
>
> 1) Write a whole array in a new HDF5 file by iteration on subregion writting.
> For example: write NZ times an array of dimension (NY*NX) in a new HDF5 file
> that will finally store an array of dimensions (NZ*NY*NX).
>
> 2) Paste (override) a subregion in an existing HDF5 file. (This require to
> open the file in a different mode).
>
> I know how to do it in HDF5, I've looked at the source code of the HDF5 ITK
> module, and have some questions on how to patch the HDF5 module.
>
> To support reading and writing subregion, HDF5 manipulates simple arrays
> defining the start and the size of the region to read/write. These arrays are
> 'HDFSize' and 'offset' in the method HDF5ImageIO::SetupStreaming of the file
> itkHDF5ImageIO.cxx, and their values are set according to the size and index
> of the region 'this->GetIORegion()':
>
> void
> HDF5ImageIO
> ::SetupStreaming(H5::DataSpace *imageSpace, H5::DataSpace *slabSpace)
> {
> ImageIORegion regionToRead = this->GetIORegion();
> ImageIORegion::SizeType size = regionToRead.GetSize();
> ImageIORegion::IndexType start = regionToRead.GetIndex();
> //
> int numComponents = this->GetNumberOfComponents();
>
> const int HDFDim(this->GetNumberOfDimensions() +
> (numComponents > 1 ? 1 : 0));
> hsize_t *offset = new hsize_t[HDFDim];
> hsize_t *HDFSize = new hsize_t[HDFDim];
> int limit;
> //
> // fastest moving dimension is intra-voxel
> // index
> if(numComponents > 1)
> {
> limit = HDFDim - 1;
> offset[limit] = 0;
> HDFSize[limit] = numComponents;
> }
> else
> {
> limit = HDFDim;
> }
> for(int i=0; i < limit; i++)
> {
> offset[limit - i - 1] = start[i];
> HDFSize[limit - i - 1] = size[i];
> }
> slabSpace->setExtentSimple(HDFDim,HDFSize);
> imageSpace->selectHyperslab(H5S_SELECT_SET,HDFSize,offset);
> delete[] HDFSize;
> delete[] offset;
> }
>
> When reading a file, 'this->GetIORegion()' can be modified by calling
> reader->GetOutput()->SetRequestedRegion(requestedRegion);
> which enables input streaming.
>
> But how to modifiy 'this->GetIORegion()' when writing in a file, for case 1)
> and 2)?
>
> Which example / source code can I look to get started with writer streaming?
>
> Thanks for your help!
>
> David
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://kitware.com/products/protraining.php
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-developers
More information about the Insight-developers
mailing list