Beispiel #1
0
        internal void packTOC()
        {
            int           count = TOC.GetLength(0);
            List <string> tiks  = new List <string>(count);
            List <string> sizes = new List <string>(count);

            for (int i = 0; i < count; i++)
            {
                tiks.Add(TOC[i, 0]);
                sizes.Add(TOC[i, 1]);
            }
            _tiks = tiks.ToArray();
            _size = sizes.ToArray();
        }
Beispiel #2
0
        int estsize()
        {
            int size = 0;

            for (int i = 0; i < TOC.GetLength(0); i++)
            {
                int s = 0;
                if (int.TryParse(TOC[i, 1], out s))
                {
                    size += s;
                }
            }
            return(size);
        }
Beispiel #3
0
        /// <summary>
        /// build the index
        /// </summary>
        public void Start()
        {
            const int RATE    = 30000;
            int       esttick = estsize() / 40;
            double    est     = esttick / RATE;
            TimeSpan  ts      = new TimeSpan(0, 0, (int)est);

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            debug("Starting creation of index... estimated: " + ts.ToString());
            // start the workers
            for (int i = 0; i < TOC.GetLength(0); i++)
            {
                // try provided path
                string fn = TOC[i, 0];
                // ensure file exists
                if (File.Exists(fn))
                {
                    readers.Add(new tickreader(i, fn, _binaryindex, Interval));
                }
                else
                {
                    // try default path
                    fn = Folder + "\\" + Path.GetFileName(TOC[i, 0]);
                    if (File.Exists(fn))
                    {
                        readers.Add(new tickreader(i, fn, _binaryindex, Interval));
                    }
                    else
                    {
                        debug(fn + " not found.");
                    }
                }
            }
            debug("Started " + readers.Count + " readers, waiting for completition");
            // wait till they're done
            _running = true;
            while (_running)
            {
                System.Threading.Thread.Sleep(SLEEP);
                bool busy = false;
                for (int i = 0; i < readers.Count; i++)
                {
                    busy |= readers[i].IsBusy;
                }
                _running = busy;
            }
            debug("Readers completed, assembling master index.");
            _running = false;
            // estimate size
            int  size     = 0;
            bool finished = true;

            foreach (tickreader tr in readers)
            {
                finished &= tr.finished;
                size     += tr.count;
            }
            // append to single arrays
            List <long> times = new List <long>(size);
            List <int>  index = new List <int>(size);

            foreach (tickreader tr in readers)
            {
                times.AddRange(tr.datetimes);
                index.AddRange(tr.index);
            }
            long[] ltimes = times.ToArray();
            int[]  iindex = index.ToArray();
            // sort master array
            Array.Sort(ltimes, iindex);
            // save play index
            _idx = iindex;
            // save times
            _times = ltimes;
            // see if we're saving binary index
            if (_binaryindex)
            {
                // fake symbol name
                string sym = MD5(indextoc(this));
                // ensure binary index folder exists
                if (!Directory.Exists(IndexFolder))
                {
                    Directory.CreateDirectory(IndexFolder);
                }
                // create file
                TikWriter tw = new TikWriter(IndexFolder, sym, 0);
                // get a filename
                _binaryidx = tw.Filepath;
                debug("Creating binary index: " + BinaryIndex);
                // master tick list
                Tick[] ktiks = new Tick[times.Count];
                ltimes = times.ToArray();
                int next = 0;
                for (int i = 0; i < readers.Count; i++)
                {
                    int len = readers[i].ticks.Count;
                    readers[i].ticks.CopyTo(0, ktiks, next, len);
                    next += len;
                    readers[i].ticks.Clear();
                }
                // sort ticks
                Array.Sort(ltimes, ktiks);
                // save ticks to binary file
                int count = 0;
                for (int i = 0; i < iindex.Length; i++)
                {
                    // get tick
                    Tick k = ktiks[count++];
                    // save
                    tw.newTick(k);
                }
                tw.Close();
                debug("binary index completed containing " + count + " ticks.");
            }
            // save finish state
            _finished = finished;
            // clean up readers
            readers.Clear();
            sw.Stop();
            double actual = sw.Elapsed.TotalSeconds;
            double rate   = actual == 0 ? 0 : ltimes.Length / actual;

            debug("Master index complete.   actual: " + sw.Elapsed.ToString() + "(" + rate.ToString("N0") + " ticks/sec)");
        }