Skip to content

Commit 79e46ec

Browse files
committed
Fix peaklist save to / load from hdf5 header size exceed 64KB bug.
1 parent 86ccf6b commit 79e46ec

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

dimspy/portals/hdf5_portal.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
1111
"""
1212

13-
import os, logging, h5py
13+
import os, sys, logging, zlib, h5py
14+
import cPickle as cp
1415
import numpy as np
1516
from ast import literal_eval
1617
from dimspy.models.peaklist_tags import PeakList_Tags
@@ -24,6 +25,16 @@ def _eval(v):
2425
except (ValueError, SyntaxError):
2526
return str(v)
2627

28+
def _packMeta(v):
29+
dv = cp.dumps(v)
30+
# in case unicode chars, which are 4 times larger then str in python
31+
return ['O', dv] if sys.getsizeof(dv) / 1000. < 16 else \
32+
['C', zlib.compress(dv)]
33+
34+
def _unpackMeta(v):
35+
dv = zlib.decompress(v[1]) if v[0] == 'C' else v[1]
36+
return cp.loads(dv)
37+
2738

2839
# peaklists portals
2940
def save_peaklists_as_hdf5(pkls, filename):
@@ -56,7 +67,7 @@ def _savepkl(i, pkl):
5667

5768
dset.attrs['flag_attrs'] = pkl.flag_attributes
5869
dset.attrs['tags'] = [(t if type(t) in (tuple, list) else ('None', t)) for t in pkl.tags.to_list()]
59-
for k, v in pkl.metadata.items(): dset.attrs['metadata_' + k] = v
70+
for k, v in pkl.metadata.items(): dset.attrs['metadata_' + k] = _packMeta(v)
6071

6172
map(lambda x: _savepkl(*x), enumerate(pkls))
6273

@@ -89,7 +100,7 @@ def _loadpkl(ID):
89100
if dn[0] != 'mz' or dn[1] != 'intensity':
90101
raise IOError('PANIC: HDF5 dataset matrix not in order')
91102
pkl = PeakList(ID, dm[0].astype(np.float64), dm[1].astype(np.float64),
92-
**{k[9:]: v for k,v in dset.attrs.items() if k.startswith('metadata_')})
103+
**{k[9:]: _unpackMeta(v) for k,v in dset.attrs.items() if k.startswith('metadata_')})
93104

94105
for n, v, t in zip(dn[2:], dm[2:], dt[2:]):
95106
pkl.add_attribute(n, v, t, is_flag=(n in dset.attrs['flag_attrs']), flagged_only=False)

0 commit comments

Comments
 (0)