Hello!
HDF5 implements data caching which improves read performance substantially:
https://support.hdfgroup.org/HDF5/doc/H5.user/Caching.html
However, it turns our like there is no write cache. Consider the following Pascal procedure which fills a 4Kx4K matrix row-wise:
procedure Test;
var
Dll: THDF5Dll;
dims, start, count: array of hsize_t;
n: hsize_t;
f: hid_t;
d: hid_t;
mems, s: hid_t;
cpl: hid_t;
v: array of Double;
i: Integer;
begin
Dll := THDF5Dll.Create('hdf5.dll');
f := Dll.H5Fopen('test.hdf5', H5F_ACC_RDWR or H5F_ACC_CREAT, H5P_DEFAULT);
SetLength(dims, 2);
dims[0] := 4096;
dims[1] := 4096;
s := Dll.H5Screate_simple(2, Phsize_t(dims), nil);
cpl := Dll.H5Pcreate(Dll.H5P_DATASET_CREATE);
dims[0] := 1;
dims[1] := 4096;
Dll.H5Pset_chunk(cpl, 2, Phsize_t(dims));
d := Dll.H5Dcreate2(f, 'matrix', Dll.H5T_INTEL_F64, s,
H5P_DEFAULT, cpl, H5P_DEFAULT);
Random(6031986);
SetLength(v, 4096);
for i := 0 to 4095 do
v[i] := Random;
n := 4096;
mems := Dll.H5Screate_simple(1, @n, nil);
dims[1] := 4096;
SetLength(start, 2);
start[1] := 0;
SetLength(count, 2);
count[0] := 1;
count[1] := 4096;
for i := 0 to 4095 do
begin
s := Dll.H5Dget_space(d);
start[0] := i;
Dll.H5Sselect_hyperslab(s, H5S_SELECT_SET,
Phsize_t(start), nil, Phsize_t(count), nil);
Dll.H5Dwrite(d, Dll.H5T_NATIVE_DOUBLE, mems, s, H5P_DEFAULT, PDouble(v));
Dll.H5Sclose(s);
end;
Dll.H5Fflush(d, H5F_SCOPE_LOCAL);
end;
It's a minimal example, so memleaks are possible; but anyway the program finishes very quickly.
However, when I change
1)cpl := Dll.H5Pcreate(Dll.H5P_DATASET_CREATE);
dims[0] := 1;
dims[1] := 4096;
Dll.H5Pset_chunk(cpl, 2, Phsize_t(dims));
to
2)cpl := Dll.H5Pcreate(Dll.H5P_DATASET_CREATE);
dims[0] := 64;
dims[1] := 64;
Dll.H5Pset_chunk(cpl, 2, Phsize_t(dims));
I see the program slowing down by a factor of >30!
The detailed stats for the former and latter cases reveal the dramatic difference:
1) 1x4K chunks
Clock time (sec): 0.171
CPU time (sec): 0.141
I/O read (MB): 0.000
I/O read ops: 0
I/O write (MB): 134.416
I/O write ops: 4171
2) 64x64 chunks
Clock time (sec): 6.046
CPU time (sec): 5.969
I/O read (MB): 8455.717
I/O read ops: 258048
I/O write (MB): 8590.132
I/O write ops: 262222
It appears that for 64x64 case the data is written/read multiple times yielding a whooping 17G total I/O.
Is it possible that data caching is also implemented for write?
Best wishes,
Andrey Paramonov
···
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.