def _test_compression_warns_when_decompress_caches(self, compress): not_garbage = [] control = [] # copied data compress_module = globals()[compress] real_decompress = compress_module.decompress def decompress(ob): """mock decompress function that delegates to the real decompress but caches the result and a copy of the result. """ res = real_decompress(ob) not_garbage.append(res) # hold a reference to this bytes object control.append(bytearray(res)) # copy the data here to check later return res # types mapped to values to add in place. rhs = { np.dtype('float64'): 1.0, np.dtype('int32'): 1, np.dtype('object'): 'a', np.dtype('datetime64[ns]'): np.timedelta64(1, 'ns'), np.dtype('timedelta64[ns]'): np.timedelta64(1, 'ns'), } with patch(compress_module, 'decompress', decompress), \ tm.assert_produces_warning(PerformanceWarning) as ws: i_rec = self.encode_decode(self.frame, compress=compress) for k in self.frame.keys(): value = i_rec[k] expected = self.frame[k] assert_frame_equal(value, expected) # make sure that we can write to the new frames even though # we needed to copy the data for block in value._data.blocks: assert block.values.flags.writeable # mutate the data in some way block.values[0] += rhs[block.dtype] for w in ws: # check the messages from our warnings if not isinstance(w, DeprecationWarning): self.assertEqual( str(w.message), 'copying data after decompressing; this may mean that' ' decompress is caching its result', ) for buf, control_buf in zip(not_garbage, control): # make sure none of our mutations above affected the # original buffers self.assertEqual(buf, control_buf)
def _test_compression_warns_when_decompress_caches(self, compress): not_garbage = [] control = [] # copied data compress_module = globals()[compress] real_decompress = compress_module.decompress def decompress(ob): """mock decompress function that delegates to the real decompress but caches the result and a copy of the result. """ res = real_decompress(ob) not_garbage.append(res) # hold a reference to this bytes object control.append(bytearray(res)) # copy the data here to check later return res # types mapped to values to add in place. rhs = { np.dtype('float64'): 1.0, np.dtype('int32'): 1, np.dtype('object'): 'a', np.dtype('datetime64[ns]'): np.timedelta64(1, 'ns'), np.dtype('timedelta64[ns]'): np.timedelta64(1, 'ns'), } with patch(compress_module, 'decompress', decompress), \ tm.assert_produces_warning(PerformanceWarning) as ws: i_rec = self.encode_decode(self.frame, compress=compress) for k in self.frame.keys(): value = i_rec[k] expected = self.frame[k] assert_frame_equal(value, expected) # make sure that we can write to the new frames even though # we needed to copy the data for block in value._data.blocks: self.assertTrue(block.values.flags.writeable) # mutate the data in some way block.values[0] += rhs[block.dtype] for w in ws: # check the messages from our warnings self.assertEqual( str(w.message), 'copying data after decompressing; this may mean that' ' decompress is caching its result', ) for buf, control_buf in zip(not_garbage, control): # make sure none of our mutations above affected the # original buffers self.assertEqual(buf, control_buf)