@@ -225,9 +225,11 @@ public boolean sort(DataReader<T> inputReader, DataWriter<T> resultWriter)
225
225
inputReader .close ();
226
226
_phase = SortingState .Phase .SORTING ;
227
227
_writeAll (resultWriter , items );
228
- } else {
229
- // but if more data than memory-buffer-full, do it right:
230
- List <File > presorted = presort (inputReader , buffer , items , next );
228
+ } else { // but if more data than memory-buffer-full, do it right:
229
+ List <File > presorted = new ArrayList <File >();
230
+ presorted .add (_writePresorted (items ));
231
+ items = null ; // it's a big array, clear refs as early as possible
232
+ _presort (inputReader , buffer , next , presorted );
231
233
inputClosed = true ;
232
234
inputReader .close ();
233
235
_phase = SortingState .Phase .SORTING ;
@@ -312,21 +314,16 @@ private Object[] _readMax(DataReader<T> inputReader, SegmentedBuffer buffer,
312
314
return buffer .completeAndClearBuffer (segment , ptr );
313
315
}
314
316
315
- protected List < File > presort (DataReader <T > inputReader ,
316
- SegmentedBuffer buffer ,
317
- Object [] firstSortedBatch , T nextValue ) throws IOException
317
+ protected void _presort (DataReader <T > inputReader , SegmentedBuffer buffer , T nextValue ,
318
+ List < File > presorted )
319
+ throws IOException
318
320
{
319
- ArrayList <File > presorted = new ArrayList <File >();
320
- presorted .add (_writePresorted (firstSortedBatch ));
321
- // important: clear out the ref to let possibly sizable array to be GCed
322
- firstSortedBatch = null ;
323
321
do {
324
322
Object [] items = _readMax (inputReader , buffer , _config .getMaxMemoryUsage (), nextValue );
325
323
Arrays .sort (items , _rawComparator ());
326
324
presorted .add (_writePresorted (items ));
327
325
nextValue = inputReader .readNext ();
328
326
} while (nextValue != null );
329
- return presorted ;
330
327
}
331
328
332
329
protected File _writePresorted (Object [] items ) throws IOException
0 commit comments