[ 
https://issues.apache.org/jira/browse/DRILL-5011?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15649214#comment-15649214
 ] 

Paul Rogers commented on DRILL-5011:
------------------------------------

Proposed solution:

The best solution is to revise the "copier" to track actual memory use. But, 
copier is generated code so doing so is a big project. Short-term alternative: 
use a better record width estimate.

ESB already maintains a running cumulative record count.

Add a new count that is the in-memory count (total record count - spilled 
record count).

The ESB allocator already maintains a counter of the total memory allocated to 
the ESB (which, by definition, must be for the in-memory batches.)

Compute a better record width estimate as:

{{record width estimate = allocated memory / in-memory record count}}

In a simple experiment:

{code}
Original record width estimate: 324
Revised record width estimate: 114
{code}



> External Sort Batch memory use depends on record width
> ------------------------------------------------------
>
>                 Key: DRILL-5011
>                 URL: https://issues.apache.org/jira/browse/DRILL-5011
>             Project: Apache Drill
>          Issue Type: Bug
>    Affects Versions: 1.8.0
>            Reporter: Paul Rogers
>            Priority: Minor
>
> The ExternalSortBatch operator uses spill-to-disk to keep memory needs within 
> a defined limit. However, the "copier" (really, the merge operation) can use 
> an amount of memory determined not by the operator configuration, but by the 
> width of each record.
> The copier memory limit appears to be set by the COPIER_BATCH_MEM_LIMIT value.
> However, the actual memory use is determined by the number of records that 
> the copier is asked to copy. That record comes from an estimate of row width 
> based on the type of each column. Note that the row width *is not* based on 
> the actual data in each row. Varchar fields, for example, are assumed to be 
> 40 characters wide. If the sorter is asked to sort records with Varchar 
> fields of, say, 1000 characters, then the row width estimate will be a poor 
> estimator of actual width.
> Memory use is based on a
> {code}
> target record count = memory limit / estimate row width
> {code}
> Actual memory use is:
> {code}
> memory use = target row count * actual row width
> {code}
> Which is
> {code}
> memory use = memory limit * actual row width  / estimate row width
> {code}
> That is, memory use depends on the ratio of actual to estimated width. If the 
> estimate is off by 2, then we use twice as much memory as expected.
> Not that the memory used for the copier defaults to 20 MB, so even an error 
> of 4x still means only 80 MB of memory used; small in comparison to the many 
> GB typically allocated to ESB storage.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to