/// <summary>
        /// Creates a new empty TimeSeriesStreamCollection object. It initializes an underlying MemoryStream and
        /// inits it with default values for all TimeSeries (one for each given key is created). Every write access
        /// to any TimeSeries will then be in-place on the already allocated buffer with the fixed size of
        /// keys.Count * bucketCount.
        /// </summary>
        public TimeSeriesStreamCollection(IEnumerable <TKey> keys, int keySize, Action <TKey, Stream> writeKeyAction, TimeSeriesSpan span, int decimalPlaces = 1) : base()
        {
            var keyList = keys.ToList();

            Metrics = new BinaryStreamMetrics(keySize, span.Count, decimalPlaces);

            _stream = new CompressableMemoryStream(Metrics.StreamSize(keyList.Count));
            _stream.SetLength(Metrics.StreamSize(keyList.Count));

            using (var writer = new BinaryWriter(_stream, System.Text.Encoding.UTF8, true))
                writer.Write(keyList.Count);

            foreach (var i in Enumerable.Range(0, keyList.Count))
            {
                writeKeyAction(keyList[i], _stream);

                var timeseries = new TimeSeriesStream <T>(_stream, Metrics.TimeseriesPosition(i), span, decimalPlaces);
                foreach (var item in timeseries)
                {
                    timeseries[item.Key] = null;
                }

                _dict.Add(keyList[i], timeseries);
            }
        }