public static void UpdateCache(int localeId = -1, bool fullUpdate = false)
        {
            if (localeId <= 0 && fullUpdate)
            {
                Initialize();
                return;
            }

            if (localeId > 0)
            {
                var locale       = Cache.Locales.Find(i => i.LocaleId == localeId);
                var fingerPrints = ServiceAdapterUtil.GetList(locale.LastUpdated, LocaleId);
                locale.LastUpdated = DateTime.Now.AddSeconds(-15);
                UpdateLocaleCache(locale, fingerPrints);
            }
            else
            {
                var fingerPrints = ServiceAdapterUtil.GetList(Cache.LastFullUpdate);
                foreach (var locale in Cache.Locales)
                {
                    locale.LastUpdated = DateTime.Now.AddSeconds(-15);
                    var pfs = fingerPrints.FindAll(i => i.LocaleId == locale.LocaleId);
                    UpdateLocaleCache(locale, pfs);
                }
                Cache.LastFullUpdate = DateTime.Now.AddSeconds(-15);
            }
            SetupThreadDistribution();
        }
        private static void CacheFingerprints()
        {
            var container    = new Dictionary <int, List <MemberFingerprint> >();
            var fingerPrints = new List <MemberFingerprint>();

            Cache = new FingerprintCache();

            var dataDir = "";

            if (BenchmarkMode && Directory.Exists(dataDir = Path.Combine(StartupPath, "Data")))
            {
                var files = Directory.EnumerateFiles(dataDir);
                int i     = 0;
                foreach (var file in files)
                {
                    i++;
                    var print = File.ReadAllBytes(file);
                    fingerPrints.Add(new MemberFingerprint {
                        Id = i, MemberId = i, Fingerprint = print, Size = print.Length
                    });
                }
            }
            else
            {
                if (Mode != MatcherModes.ClientNoCache)
                {
                    if (Mode == MatcherModes.ClientLocaleCache)
                    {
                        fingerPrints = ServiceAdapterUtil.GetList(DateTime.MinValue, LocaleId);
                        if (Cache.Fingerprints.ContainsKey(LocaleId))
                        {
                            Cache.Locales[LocaleId].LastUpdated = DateTime.Now.AddSeconds(-15);
                        }
                    }
                    else if (Mode == MatcherModes.ServerFullCache)
                    {
                        fingerPrints         = ServiceAdapterUtil.GetList(DateTime.MinValue);
                        Cache.LastFullUpdate = DateTime.Now.AddSeconds(-15);
                    }

                    if (SaveTempalates && BenchmarkMode)
                    {
                        if (!Directory.Exists(dataDir))
                        {
                            Directory.CreateDirectory(dataDir);
                        }

                        int i = 0;
                        foreach (var data in fingerPrints)
                        {
                            i++;
                            File.WriteAllBytes(Path.Combine(dataDir, string.Format("{0}.dat", i.ToString("D4"))), data.Fingerprint);
                        }
                    }

                    Cache.Initialize(fingerPrints);

                    if (false && fingerPrints.Count > 0 && BenchmarkMode)
                    {
                        if (!Directory.Exists(dataDir))
                        {
                            Directory.CreateDirectory(dataDir);
                        }

                        int i = 0;
                        foreach (var fp in fingerPrints)
                        {
                            i++;
                            File.WriteAllBytes(Path.Combine(dataDir, string.Format("{0}.dat", i.ToString("D4"))), fp.Fingerprint);
                        }
                    }
                }
            }

            if (BenchmarkMode)
            {
                bool suffleLastRecord = CacheSize > 0;
                var  initialCount     = fingerPrints.Count;

                var last = fingerPrints[initialCount - 1];
                if (suffleLastRecord)
                {
                    fingerPrints[initialCount - 1] = fingerPrints[0];
                }

                var index     = 0;
                var cacheSize = CacheSize > initialCount ? CacheSize : initialCount;
                for (int i = initialCount; i < cacheSize; i++)
                {
                    fingerPrints.Add(fingerPrints[index]);
                    index++;
                    if (index == initialCount)
                    {
                        index = 0;
                    }
                }
                Cache.Samples = fingerPrints;

                if (suffleLastRecord)
                {
                    var random = new Random().Next(0, fingerPrints.Count - 1);
                    fingerPrints[random]    = last;
                    Cache.RandomSampleIndex = random;
                }

                // Set Locales
                var totalThreads = ProcessorCores;
                var fpPerThread  = fingerPrints.Count / totalThreads;

                var currThread = 0;
                var counter    = 0;

                var localeFp = new List <MemberFingerprint>();
                Cache.Locales.Add(new LocaleInfo(currThread));
                Cache.Fingerprints.Add(currThread, localeFp);

                foreach (var item in fingerPrints)
                {
                    if (counter < fpPerThread)
                    {
                        item.LocaleId = currThread;
                        counter++;
                        localeFp.Add(item);
                    }
                    else
                    {
                        counter = 0;
                        currThread++;

                        localeFp = new List <MemberFingerprint>();
                        Cache.Locales.Add(new LocaleInfo(currThread));
                        Cache.Fingerprints.Add(currThread, localeFp);
                        item.LocaleId = currThread;
                    }
                }
            }
        }