Good remark, if we really want to be memory efficient and fully leverage the automated memory mapping of parallel, we could pre-compute the split in the master process once to have the results of the split memory mapped and have workers do the `n_train_samples` sub-slicing inside `_cross_val_score`.

```python

out = parallel(delayed(_cross_val_score)(
            clone(estimator), _split(estimator, X, y, train), _split(estimator, X, y, test), scorer, n_train_samples, verbose, fit_params=None, return_train_score=True)
            for train, test in cv for n_train_samples in train_sizes_abs)
```

However this makes the code more complicated and I am not sure it's worth it. It would require benchmarks to play with the various trade-offs for the `cross_val_score`, `learning_curves` and `GridSearchCV` usage cases.