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(); }
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); }
/// <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)"); }