@@ -58,7 +58,7 @@ def read_data_block(darray, fname, data, mmap):
58
58
59
59
Returns
60
60
-------
61
- numpy.ndarray containing the parsed data
61
+ `` numpy.ndarray`` or ``numpy.memmap`` containing the parsed data
62
62
"""
63
63
if mmap not in (True , False , 'c' , 'r' , 'r+' ):
64
64
raise ValueError ("mmap value should be one of True, False, 'c', "
@@ -87,10 +87,20 @@ def read_data_block(darray, fname, data, mmap):
87
87
ext_fname = op .join (op .dirname (fname ), darray .ext_fname )
88
88
if not op .exists (ext_fname ):
89
89
raise GiftiParseError ('Cannot locate external file ' + ext_fname )
90
- with open (ext_fname , 'rb' ) as f :
91
- f .seek (darray .ext_offset )
92
- nbytes = np .prod (darray .dims ) * dtype ().itemsize
93
- buff = f .read (nbytes )
90
+ if mmap :
91
+ newarr = np .memmap (ext_fname ,
92
+ dtype = dtype ,
93
+ mode = mmap ,
94
+ offset = darray .ext_offset ,
95
+ shape = tuple (darray .dims ))
96
+ else :
97
+ # We can replace this with a call to np.fromfile in numpy>=1.17,
98
+ # as an "offset" paramter was added in that version.
99
+ with open (ext_fname , 'rb' ) as f :
100
+ f .seek (darray .ext_offset )
101
+ nbytes = np .prod (darray .dims ) * dtype ().itemsize
102
+ buff = f .read (nbytes )
103
+ newarr = np .frombuffer (buff , dtype = dtype )
94
104
95
105
# Numpy arrays created from bytes objects are read-only.
96
106
# Neither b64decode nor decompress will return bytearrays, and there
@@ -107,9 +117,9 @@ def read_data_block(darray, fname, data, mmap):
107
117
# GIFTI_ENCODING_B64GZ
108
118
buff = bytearray (zlib .decompress (dec ))
109
119
del dec
120
+ newarr = np .frombuffer (buff , dtype = dtype )
110
121
111
122
sh = tuple (darray .dims )
112
- newarr = np .frombuffer (buff , dtype = dtype )
113
123
if len (newarr .shape ) != len (sh ):
114
124
newarr = newarr .reshape (
115
125
sh , order = array_index_order_codes .npcode [darray .ind_ord ])
0 commit comments