public virtual void Build(MetricDB original, Index refs, int k)
{
this.K = k;
this.IdxRefs = refs;
var n = original.Count;
this.Fingerprints = new List<int[]> (n);
for (int i = 0; i < n; ++i) {
this.Fingerprints.Add (null);
}
var tasks = Environment.ProcessorCount << 3;
int blocksize = n / tasks;
int advance = 0;
long minElapsedTicks = 20000000; // control the print rate
long prevTicks = DateTime.Now.Ticks;
long currTicks;
var create_block = new Action<int> (delegate(int blockID) {
var sp = blockID * blocksize;
var ep = Math.Min (n, sp + blocksize);
currTicks = DateTime.Now.Ticks;
if (advance == 0 || currTicks - prevTicks > minElapsedTicks) {
Console.WriteLine ("KnrFP {0} ({1}/{2}), db: {3}, num_refs: {4}, K: {5}, timestamp: {6}",
this, advance, n, Path.GetFileName(original.Name), this.IdxRefs.DB.Count, this.K, DateTime.Now);
prevTicks = currTicks;
}
for (; sp < ep; ++sp) {
var fp = this.GetFP(original[sp]);
this.Fingerprints[sp] = fp;
advance++;
}
});
LongParallel.For (0, 1 + n / blocksize, create_block);
Console.WriteLine ("done");
}