diff --git a/influxql/engine.go b/influxql/engine.go index 28d83d8805..4ca152e183 100644 --- a/influxql/engine.go +++ b/influxql/engine.go @@ -10,6 +10,9 @@ import ( "time" ) +// how many values we will map before emitting +const emitBatchSize = 1000 + // DB represents an interface for creating transactions. type DB interface { Begin() (Tx, error) @@ -756,6 +759,13 @@ func MapStddev(itr Iterator, e *Emitter, tmax int64) { for k, v := itr.Next(); k != 0; k, v = itr.Next() { values = append(values, v.(float64)) + // Emit in batches. + // unbounded emission of data can lead to excessive memory use + // or other potential performance problems. + if len(values) == emitBatchSize { + e.Emit(Key{tmax, itr.Tags()}, values) + values = []float64{} + } } if len(values) > 0 { e.Emit(Key{tmax, itr.Tags()}, values)