Skip to content

Commit 9e6fc2e

Browse files
authored
Merge pull request #732 from ChristosT/make-framecache-pickleable
Make framecache pickleable
2 parents ba52e1a + ef025a3 commit 9e6fc2e

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

hexrd/imageseries/load/framecache.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,23 @@ def __iter__(self):
229229
# @memoize
230230
def __len__(self):
231231
return self._nframes
232+
233+
def __getstate__(self):
234+
# Remove any non-pickleable attributes
235+
to_remove = [
236+
'_load_framelist_lock',
237+
]
238+
239+
# Make a copy of the dict to modify
240+
state = self.__dict__.copy()
241+
242+
# Remove them
243+
for attr in to_remove:
244+
state.pop(attr)
245+
246+
return state
247+
248+
def __setstate__(self, state):
249+
self.__dict__.update(state)
250+
# initialize lock after un-pickling
251+
self._load_framelist_lock = Lock()
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import os
2+
import pickle
3+
import tempfile
4+
import unittest
5+
6+
from .common import make_array_ims
7+
from hexrd.imageseries.load.hdf5 import HDF5ImageSeriesAdapter
8+
from hexrd.imageseries.load.framecache import FrameCacheImageSeriesAdapter
9+
from hexrd import imageseries
10+
11+
12+
class ImageSeriesPickleableTest(unittest.TestCase):
13+
@classmethod
14+
def setUpClass(cls):
15+
cls.tmpdir = tempfile.mkdtemp()
16+
17+
@classmethod
18+
def tearDownClass(cls):
19+
os.rmdir(cls.tmpdir)
20+
21+
22+
class TestHDF5SeriesAdapter(ImageSeriesPickleableTest):
23+
def setUp(self):
24+
self.h5file = os.path.join(self.tmpdir, 'test_ims.h5')
25+
self.h5path = 'array-data'
26+
self.fmt = 'hdf5'
27+
_, self.is_a = make_array_ims()
28+
29+
def tearDown(self):
30+
os.remove(self.h5file)
31+
32+
def test_fmth5(self):
33+
"""save/load HDF5 format"""
34+
imageseries.write(self.is_a, self.h5file, self.fmt, path=self.h5path)
35+
adapter = HDF5ImageSeriesAdapter(self.h5file, path=self.h5path)
36+
# will throw if adapter is not pickleable
37+
pickle.dumps(adapter)
38+
39+
40+
class TestFormatFrameCacheNPZSeriesAdapter(ImageSeriesPickleableTest):
41+
def setUp(self):
42+
self.fcfile = os.path.join(self.tmpdir, 'frame-cache.npz')
43+
self.fmt = 'frame-cache'
44+
self.style = 'npz'
45+
self.thresh = 0.5
46+
self.cache_file = 'frame-cache.npz'
47+
_, self.is_a = make_array_ims()
48+
49+
def tearDown(self):
50+
os.remove(self.fcfile)
51+
52+
def test_npz(self):
53+
imageseries.write(
54+
self.is_a,
55+
self.fcfile,
56+
self.fmt,
57+
style=self.style,
58+
threshold=self.thresh,
59+
cache_file=self.cache_file,
60+
)
61+
adapter = FrameCacheImageSeriesAdapter(self.fcfile, style=self.style)
62+
# will throw if adapter is not pickleable
63+
pickle.dumps(adapter)
64+
65+
66+
class TestFormatFrameCacheFCH5SeriesAdapter(ImageSeriesPickleableTest):
67+
def setUp(self):
68+
self.fcfile = os.path.join(self.tmpdir, 'frame-cache.fch5')
69+
self.fmt = 'frame-cache'
70+
self.style = 'fch5'
71+
self.thresh = 0.5
72+
self.cache_file = 'frame-cache.fch5'
73+
_, self.is_a = make_array_ims()
74+
75+
def tearDown(self):
76+
os.remove(self.fcfile)
77+
78+
def test_fmth5(self):
79+
imageseries.write(
80+
self.is_a,
81+
self.fcfile,
82+
self.fmt,
83+
style=self.style,
84+
threshold=self.thresh,
85+
cache_file=self.cache_file,
86+
)
87+
adapter = FrameCacheImageSeriesAdapter(self.fcfile, style=self.style)
88+
# will throw if adapter is not pickleable
89+
pickle.dumps(adapter)

0 commit comments

Comments
 (0)