@@ -3037,7 +3037,11 @@ def write(self, obj, axes=None, append=False, complib=None,
3037
3037
self .write_data (chunksize )
3038
3038
3039
3039
def write_data (self , chunksize ):
3040
- """ fast writing of data: requires specific cython routines each axis shape """
3040
+ """ we form the data into a 2-d including indexes,values,mask
3041
+ write chunk-by-chunk """
3042
+
3043
+ names = self .dtype .names
3044
+ nrows = self .nrows_expected
3041
3045
3042
3046
# create the masks & values
3043
3047
masks = []
@@ -3052,30 +3056,49 @@ def write_data(self, chunksize):
3052
3056
mask = masks [0 ]
3053
3057
for m in masks [1 :]:
3054
3058
mask = mask & m
3059
+ mask = mask .ravel ()
3060
+
3061
+ # broadcast the indexes if needed
3062
+ indexes = [ a .cvalues for a in self .index_axes ]
3063
+ nindexes = len (indexes )
3064
+ bindexes = []
3065
+ for i , idx in enumerate (indexes ):
3066
+
3067
+ # broadcast to all other indexes except myself
3068
+ if i > 0 and i < nindexes :
3069
+ repeater = np .prod ([indexes [bi ].shape [0 ] for bi in range (0 ,i )])
3070
+ idx = np .tile (idx ,repeater )
3055
3071
3056
- # the arguments
3057
- indexes = [a .cvalues for a in self .index_axes ]
3058
- values = [a .take_data () for a in self .values_axes ]
3072
+ if i < nindexes - 1 :
3073
+ repeater = np .prod ([indexes [bi ].shape [0 ] for bi in range (i + 1 ,nindexes )])
3074
+ idx = np .repeat (idx ,repeater )
3075
+
3076
+ bindexes .append (idx )
3059
3077
3060
3078
# transpose the values so first dimension is last
3079
+ # reshape the values if needed
3080
+ values = [ a .take_data () for a in self .values_axes ]
3061
3081
values = [ v .transpose (np .roll (np .arange (v .ndim ),v .ndim - 1 )) for v in values ]
3082
+ bvalues = []
3083
+ for i , v in enumerate (values ):
3084
+ new_shape = (nrows ,) + self .dtype [names [nindexes + i ]].shape
3085
+ bvalues .append (values [i ].ravel ().reshape (new_shape ))
3062
3086
3063
3087
# write the chunks
3064
3088
if chunksize is None :
3065
3089
chunksize = 100000
3066
3090
3067
- rows = self .nrows_expected
3068
- chunks = int (rows / chunksize ) + 1
3091
+ chunks = int (nrows / chunksize ) + 1
3069
3092
for i in range (chunks ):
3070
3093
start_i = i * chunksize
3071
- end_i = min ((i + 1 ) * chunksize , rows )
3094
+ end_i = min ((i + 1 ) * chunksize , nrows )
3072
3095
if start_i >= end_i :
3073
3096
break
3074
3097
3075
3098
self .write_data_chunk (
3076
- indexes = [a [start_i :end_i ] for a in indexes ],
3099
+ indexes = [a [start_i :end_i ] for a in bindexes ],
3077
3100
mask = mask [start_i :end_i ],
3078
- values = [v [start_i :end_i ] for v in values ])
3101
+ values = [v [start_i :end_i ] for v in bvalues ])
3079
3102
3080
3103
def write_data_chunk (self , indexes , mask , values ):
3081
3104
@@ -3085,35 +3108,18 @@ def write_data_chunk(self, indexes, mask, values):
3085
3108
return
3086
3109
3087
3110
try :
3088
- nrows = np . prod ([ idx .shape [0 ] for idx in indexes ])
3111
+ nrows = indexes [ 0 ] .shape [0 ]
3089
3112
rows = np .empty (nrows ,dtype = self .dtype )
3090
3113
names = self .dtype .names
3114
+ nindexes = len (indexes )
3091
3115
3092
3116
# indexes
3093
- nindexes = len (indexes )
3094
3117
for i , idx in enumerate (indexes ):
3095
-
3096
- # broadcast to all other indexes except myself
3097
- if i > 0 and i < nindexes :
3098
- repeater = np .prod ([indexes [bi ].shape [0 ] for bi in range (0 ,i )])
3099
- idx = np .tile (idx ,repeater )
3100
-
3101
- if i < nindexes - 1 :
3102
- repeater = np .prod ([indexes [bi ].shape [0 ] for bi in range (i + 1 ,nindexes )])
3103
- idx = np .repeat (idx ,repeater )
3104
-
3105
3118
rows [names [i ]] = idx
3106
3119
3107
3120
# values
3108
3121
for i , v in enumerate (values ):
3109
- name = names [nindexes + i ]
3110
- b = values [i ]
3111
-
3112
- # reshape
3113
- new_shape = (nrows ,) + self .dtype [name ].shape
3114
- b = b .ravel ().reshape (new_shape )
3115
-
3116
- rows [name ] = b
3122
+ rows [names [i + nindexes ]] = v
3117
3123
3118
3124
# mask
3119
3125
rows = rows [~ mask .ravel ().astype (bool )]
0 commit comments