@@ -293,12 +293,16 @@ function setindex_disk_batch!(a,v,i)
293
293
for (output_indices, temparray_indices, data_indices) in zip (moutput_indices, mtemparray_indices, mdata_indicess)
294
294
transfer_results_write! (v, temparray, output_indices, temparray_indices)
295
295
vtemparray = maybeshrink (temparray, a, data_indices)
296
+ if any (ind-> is_sparse_index (ind,density_threshold= 1.0 ),temparray_indices)
297
+ readblock! (a, vtemparray, data_indices... )
298
+ transfer_results_write! (v, temparray, output_indices, temparray_indices)
299
+ end
296
300
writeblock! (a, vtemparray, data_indices... )
297
301
end
298
302
end
299
303
300
304
function setindex_disk_nobatch! (a,v,i)
301
- indices = resolve_indices (a, i, NoBatch ())
305
+ indices = resolve_indices (a, i, NoBatch (batchstrategy (a) ))
302
306
outalias = output_aliasing (indices,ndims (a),ndims (v))
303
307
if outalias === :identical
304
308
writeblock! (a, v, indices. data_indices... )
@@ -307,6 +311,13 @@ function setindex_disk_nobatch!(a,v,i)
307
311
writeblock! (a, temparray, indices. data_indices... )
308
312
else
309
313
temparray = Array {eltype(a)} (undef, indices. temparray_size... )
314
+ if any (ind-> is_sparse_index (ind,density_threshold= 1.0 ),indices. temparray_indices)
315
+ # We have some sparse indexing pattern and are not in a batch situation, so
316
+ # we need to read before writing
317
+ # This check could be optimized away in some cases, when writing unit ranges etc,
318
+ # but is probably not too expensive
319
+ readblock! (a, temparray, indices. data_indices... )
320
+ end
310
321
transfer_results_write! (v, temparray, indices. output_indices, indices. temparray_indices)
311
322
writeblock! (a, temparray, indices. data_indices... )
312
323
end
0 commit comments