@@ -9,12 +9,11 @@ import os
9
9
from deprecated import deprecated
10
10
11
11
12
- from cpython.buffer cimport PyBUF_ANY_CONTIGUOUS, PyBUF_WRITEABLE
13
- from cpython.bytes cimport PyBytes_FromStringAndSize, PyBytes_AS_STRING
12
+ from cpython.bytes cimport PyBytes_AS_STRING, PyBytes_FromStringAndSize
13
+ from cpython.memoryview cimport PyMemoryView_GET_BUFFER
14
14
15
+ from .compat_ext cimport PyBytes_RESIZE, ensure_continguous_memoryview
15
16
16
- from .compat_ext cimport Buffer
17
- from .compat_ext import Buffer
18
17
from .compat import ensure_contiguous_ndarray
19
18
from .abc import Codec
20
19
@@ -154,17 +153,16 @@ def _cbuffer_sizes(source):
154
153
155
154
"""
156
155
cdef:
157
- Buffer buffer
156
+ memoryview source_mv
157
+ const Py_buffer* source_pb
158
158
size_t nbytes, cbytes, blocksize
159
159
160
- # obtain buffer
161
- buffer = Buffer(source, PyBUF_ANY_CONTIGUOUS)
160
+ # obtain source memoryview
161
+ source_mv = ensure_continguous_memoryview(source)
162
+ source_pb = PyMemoryView_GET_BUFFER(source_mv)
162
163
163
164
# determine buffer size
164
- blosc_cbuffer_sizes(buffer .ptr, & nbytes, & cbytes, & blocksize)
165
-
166
- # release buffers
167
- buffer .release()
165
+ blosc_cbuffer_sizes(source_pb.buf, & nbytes, & cbytes, & blocksize)
168
166
169
167
return nbytes, cbytes, blocksize
170
168
@@ -173,16 +171,15 @@ cbuffer_sizes = deprecated(_cbuffer_sizes)
173
171
def cbuffer_complib (source ):
174
172
""" Return the name of the compression library used to compress `source`."""
175
173
cdef:
176
- Buffer buffer
174
+ memoryview source_mv
175
+ const Py_buffer* source_pb
177
176
178
- # obtain buffer
179
- buffer = Buffer(source, PyBUF_ANY_CONTIGUOUS)
177
+ # obtain source memoryview
178
+ source_mv = ensure_continguous_memoryview(source)
179
+ source_pb = PyMemoryView_GET_BUFFER(source_mv)
180
180
181
181
# determine buffer size
182
- complib = blosc_cbuffer_complib(buffer .ptr)
183
-
184
- # release buffers
185
- buffer .release()
182
+ complib = blosc_cbuffer_complib(source_pb.buf)
186
183
187
184
complib = complib.decode(' ascii' )
188
185
@@ -202,18 +199,17 @@ def _cbuffer_metainfo(source):
202
199
203
200
"""
204
201
cdef:
205
- Buffer buffer
202
+ memoryview source_mv
203
+ const Py_buffer* source_pb
206
204
size_t typesize
207
205
int flags
208
206
209
- # obtain buffer
210
- buffer = Buffer(source, PyBUF_ANY_CONTIGUOUS)
207
+ # obtain source memoryview
208
+ source_mv = ensure_continguous_memoryview(source)
209
+ source_pb = PyMemoryView_GET_BUFFER(source_mv)
211
210
212
211
# determine buffer size
213
- blosc_cbuffer_metainfo(buffer .ptr, & typesize, & flags)
214
-
215
- # release buffers
216
- buffer .release()
212
+ blosc_cbuffer_metainfo(source_pb.buf, & typesize, & flags)
217
213
218
214
# decompose flags
219
215
if flags & BLOSC_DOSHUFFLE:
@@ -263,28 +259,34 @@ def compress(source, char* cname, int clevel, int shuffle=SHUFFLE,
263
259
"""
264
260
265
261
cdef:
266
- char * source_ptr
267
- char * dest_ptr
268
- Buffer source_buffer
262
+ memoryview source_mv
263
+ const Py_buffer * source_pb
264
+ const char * source_ptr
269
265
size_t nbytes, itemsize
270
266
int cbytes
271
267
bytes dest
268
+ char * dest_ptr
272
269
273
270
# check valid cname early
274
271
cname_str = cname.decode(' ascii' )
275
272
if cname_str not in list_compressors():
276
273
_err_bad_cname(cname_str)
277
274
278
- # setup source buffer
279
- source_buffer = Buffer(source, PyBUF_ANY_CONTIGUOUS)
280
- source_ptr = source_buffer.ptr
281
- nbytes = source_buffer.nbytes
275
+ # obtain source memoryview
276
+ source_mv = ensure_continguous_memoryview(source)
277
+ source_pb = PyMemoryView_GET_BUFFER(source_mv)
278
+
279
+ # extract metadata
280
+ source_ptr = < const char * > source_pb.buf
281
+ nbytes = source_pb.len
282
+
283
+ # validate typesize
282
284
if isinstance (typesize, int ):
283
285
if typesize < 1 :
284
286
raise ValueError (f" Cannot use typesize {typesize} less than 1." )
285
287
itemsize = typesize
286
288
else :
287
- itemsize = source_buffer .itemsize
289
+ itemsize = source_pb .itemsize
288
290
289
291
# determine shuffle
290
292
if shuffle == AUTOSHUFFLE:
@@ -333,16 +335,14 @@ def compress(source, char* cname, int clevel, int shuffle=SHUFFLE,
333
335
cname, blocksize, 1 )
334
336
335
337
finally :
336
-
337
- # release buffers
338
- source_buffer.release()
338
+ pass
339
339
340
340
# check compression was successful
341
341
if cbytes <= 0 :
342
342
raise RuntimeError (' error during blosc compression: %d ' % cbytes)
343
343
344
344
# resize after compression
345
- dest = dest[: cbytes]
345
+ PyBytes_RESIZE( dest, cbytes)
346
346
347
347
return dest
348
348
@@ -366,30 +366,36 @@ def decompress(source, dest=None):
366
366
"""
367
367
cdef:
368
368
int ret
369
- char * source_ptr
370
- char * dest_ptr
371
- Buffer source_buffer
372
- Buffer dest_buffer = None
369
+ memoryview source_mv
370
+ const Py_buffer* source_pb
371
+ const char * source_ptr
372
+ memoryview dest_mv
373
+ Py_buffer* dest_pb
374
+ char * dest_ptr
373
375
size_t nbytes, cbytes, blocksize
374
376
375
- # setup source buffer
376
- source_buffer = Buffer(source, PyBUF_ANY_CONTIGUOUS)
377
- source_ptr = source_buffer.ptr
377
+ # obtain source memoryview
378
+ source_mv = ensure_continguous_memoryview(source)
379
+ source_pb = PyMemoryView_GET_BUFFER(source_mv)
380
+
381
+ # get source pointer
382
+ source_ptr = < const char * > source_pb.buf
378
383
379
384
# determine buffer size
380
385
blosc_cbuffer_sizes(source_ptr, & nbytes, & cbytes, & blocksize)
381
386
382
387
# setup destination buffer
383
388
if dest is None :
384
389
# allocate memory
385
- dest = PyBytes_FromStringAndSize(NULL , nbytes)
386
- dest_ptr = PyBytes_AS_STRING(dest)
387
- dest_nbytes = nbytes
390
+ dest_1d = dest = PyBytes_FromStringAndSize(NULL , nbytes)
388
391
else :
389
- arr = ensure_contiguous_ndarray(dest)
390
- dest_buffer = Buffer(arr, PyBUF_ANY_CONTIGUOUS | PyBUF_WRITEABLE)
391
- dest_ptr = dest_buffer.ptr
392
- dest_nbytes = dest_buffer.nbytes
392
+ dest_1d = ensure_contiguous_ndarray(dest)
393
+
394
+ # obtain dest memoryview
395
+ dest_mv = memoryview(dest_1d)
396
+ dest_pb = PyMemoryView_GET_BUFFER(dest_mv)
397
+ dest_ptr = < char * > dest_pb.buf
398
+ dest_nbytes = dest_pb.len
393
399
394
400
try :
395
401
@@ -408,11 +414,7 @@ def decompress(source, dest=None):
408
414
ret = blosc_decompress_ctx(source_ptr, dest_ptr, nbytes, 1 )
409
415
410
416
finally :
411
-
412
- # release buffers
413
- source_buffer.release()
414
- if dest_buffer is not None :
415
- dest_buffer.release()
417
+ pass
416
418
417
419
# handle errors
418
420
if ret <= 0 :
@@ -449,14 +451,20 @@ def _decompress_partial(source, start, nitems, dest=None):
449
451
int encoding_size
450
452
int nitems_bytes
451
453
int start_bytes
452
- char * source_ptr
453
- char * dest_ptr
454
- Buffer source_buffer
455
- Buffer dest_buffer = None
454
+ memoryview source_mv
455
+ const Py_buffer* source_pb
456
+ const char * source_ptr
457
+ memoryview dest_mv
458
+ Py_buffer* dest_pb
459
+ char * dest_ptr
460
+ size_t dest_nbytes
456
461
457
- # setup source buffer
458
- source_buffer = Buffer(source, PyBUF_ANY_CONTIGUOUS)
459
- source_ptr = source_buffer.ptr
462
+ # obtain source memoryview
463
+ source_mv = ensure_continguous_memoryview(source)
464
+ source_pb = PyMemoryView_GET_BUFFER(source_mv)
465
+
466
+ # setup source pointer
467
+ source_ptr = < const char * > source_pb.buf
460
468
461
469
# get encoding size from source buffer header
462
470
encoding_size = source[3 ]
@@ -467,26 +475,25 @@ def _decompress_partial(source, start, nitems, dest=None):
467
475
468
476
# setup destination buffer
469
477
if dest is None :
470
- dest = PyBytes_FromStringAndSize(NULL , nitems_bytes)
471
- dest_ptr = PyBytes_AS_STRING(dest)
472
- dest_nbytes = nitems_bytes
478
+ # allocate memory
479
+ dest_1d = dest = PyBytes_FromStringAndSize(NULL , nitems_bytes)
473
480
else :
474
- arr = ensure_contiguous_ndarray(dest)
475
- dest_buffer = Buffer(arr, PyBUF_ANY_CONTIGUOUS | PyBUF_WRITEABLE)
476
- dest_ptr = dest_buffer.ptr
477
- dest_nbytes = dest_buffer.nbytes
481
+ dest_1d = ensure_contiguous_ndarray(dest)
482
+
483
+ # obtain dest memoryview
484
+ dest_mv = memoryview(dest_1d)
485
+ dest_pb = PyMemoryView_GET_BUFFER(dest_mv)
486
+ dest_ptr = < char * > dest_pb.buf
487
+ dest_nbytes = dest_pb.len
478
488
479
489
# try decompression
480
490
try :
481
491
if dest_nbytes < nitems_bytes:
482
492
raise ValueError (' destination buffer too small; expected at least %s , '
483
493
' got %s ' % (nitems_bytes, dest_nbytes))
484
494
ret = blosc_getitem(source_ptr, start, nitems, dest_ptr)
485
-
486
495
finally :
487
- source_buffer.release()
488
- if dest_buffer is not None :
489
- dest_buffer.release()
496
+ pass
490
497
491
498
# ret refers to the number of bytes returned from blosc_getitem.
492
499
if ret <= 0 :
0 commit comments