10
10
11
11
"""
12
12
13
- import os , logging , h5py
13
+ import os , sys , logging , zlib , h5py
14
+ import cPickle as cp
14
15
import numpy as np
15
16
from ast import literal_eval
16
17
from dimspy .models .peaklist_tags import PeakList_Tags
@@ -24,6 +25,16 @@ def _eval(v):
24
25
except (ValueError , SyntaxError ):
25
26
return str (v )
26
27
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
+
27
38
28
39
# peaklists portals
29
40
def save_peaklists_as_hdf5 (pkls , filename ):
@@ -56,7 +67,7 @@ def _savepkl(i, pkl):
56
67
57
68
dset .attrs ['flag_attrs' ] = pkl .flag_attributes
58
69
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 )
60
71
61
72
map (lambda x : _savepkl (* x ), enumerate (pkls ))
62
73
@@ -89,7 +100,7 @@ def _loadpkl(ID):
89
100
if dn [0 ] != 'mz' or dn [1 ] != 'intensity' :
90
101
raise IOError ('PANIC: HDF5 dataset matrix not in order' )
91
102
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_' )})
93
104
94
105
for n , v , t in zip (dn [2 :], dm [2 :], dt [2 :]):
95
106
pkl .add_attribute (n , v , t , is_flag = (n in dset .attrs ['flag_attrs' ]), flagged_only = False )
0 commit comments