public NodeGeneratorInt(string path, bool empty)
        {
            coding_table=new NameTableUniversal(path);
            if (empty)
            {
                Clear();
                coding_table.InsertPortion(Enumerable.Repeat(SpecialTypesClass.RdfType, 1));
                coding_table.BuildScale();
            }

            SpecialTypes = new SpecialTypesClass(this);
        }
        public static void Main8()
        {
            string path = "../../../Databases/";
            Console.WriteLine("Start NameTableUniversal.");
            NameTableUniversal ntu = new NameTableUniversal(path);
            int test = 4;

            if (test == 1)
            {
                string[] strs = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
                ntu.Expand(strs.Length, strs);
                ntu.BuildIndexes();
                ntu.Add("ten");
                Console.WriteLine(ntu.ToString());
            }

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            System.Random rnd = new Random();

            if (test == 2)
            {
                // Тест на ввод данных
                var different_set_query = Enumerable.Range(0, 1000000).Select(i => i.ToString());
                sw.Restart();
                ntu.Expand(10, different_set_query);
                sw.Stop();
                System.Console.WriteLine("Load ok. Duration={0}", sw.ElapsedMilliseconds);
                sw.Restart();
                ntu.BuildIndexes();
                sw.Stop();
                System.Console.WriteLine("Build indexes ok. Duration={0}", sw.ElapsedMilliseconds);
                sw.Restart();
                for (int i = 0; i < 1000; i++)
                {
                    int code = ntu.GetCode(rnd.Next(1500000).ToString());
                    //Console.WriteLine(i);
                }
                sw.Stop();
                System.Console.WriteLine("1000 GetCodeByIndex ok. Duration={0}", sw.ElapsedMilliseconds);
            }

            if (test == 3)
            {
                string[] strs1 = { "zero", "one", "two", "three", "four", "five" };
                string[] strs2 = { "six", "seven", "eight", "nine" };
                //var query = Enumerable.Repeat<int>(0, 100000).Select(x => rnd.Next());
                sw.Restart();
                ntu.Expand(10, new string[0]);
                ntu.BuildIndexes();
                ntu.InsertPortion(strs1);
                ntu.InsertPortion(strs2);
                ntu.BuildScale();
                sw.Stop();
                Console.WriteLine(ntu.ToString());
                System.Console.WriteLine(" ok. Duration={0}", sw.ElapsedMilliseconds);
            }

            if (test == 4)
            {
                int portion = 500000;
                int nportions = 2;
                int limit = 1000000000;
                var query = new List<string>(Enumerable.Repeat<int>(0, portion).Select(x => rnd.Next(limit).ToString()));
                bool tobuild = true;
                if (tobuild)
                {
                    sw.Restart();
                    ntu.Expand(portion*nportions, new string[0]);
                    ntu.BuildIndexes();
                    for (int i = 0; i < nportions; i++)
                    {
                        ntu.InsertPortion(query);
                        Console.WriteLine("portion {0} ok.", i + 1);
                    }
                    ntu.BuildScale();
                    sw.Stop();
                    System.Console.WriteLine("Load-build ok. Duration={0}", sw.ElapsedMilliseconds);
                }
                else
                {
                    sw.Restart();
                    ntu.Warmup();
                    sw.Stop();
                    System.Console.WriteLine("Warmup ok. Duration={0} volume={1}", sw.ElapsedMilliseconds, ntu.table.TableCell.Root.Count());
                }
                sw.Restart();
                int number = 0;
                foreach (var s in query.Take(10000))
                {
                    int c = ntu.GetCode(s);
                    number += c < 0 ? 0 : 1;
                }
                sw.Stop();
                System.Console.WriteLine("10000 search ok. Duration={0} number={1}", sw.ElapsedMilliseconds, number);
            }

            // Выполним только после уже построенной таблицы имен. От нее должна остаться опорная таблица cstable.pac
            if (test == 5)
            {
                int portion = 500000;
                //int nportions = 2;
                int limit = 1000000000;
                var query = Enumerable.Repeat<int>(0, portion).Select(x => rnd.Next(limit).ToString());
                bool tobuild = true;
                if (tobuild)
                {
                    sw.Restart();
                    ntu.BuildIndexes();
                    sw.Stop();
                    System.Console.WriteLine("BuildIndexes ok. Duration={0}", sw.ElapsedMilliseconds);
                }
                else
                {
                    sw.Restart();
                    ntu.Warmup();
                    sw.Stop();
                    System.Console.WriteLine("Warmup ok. Duration={0} volume={1}", sw.ElapsedMilliseconds, ntu.table.TableCell.Root.Count());
                }
                sw.Restart();
                int number = 0;
                foreach (var s in query.Take(10000))
                {
                    int c = ntu.GetCode(s);
                    number += c < 0 ? 0 : 1;
                }
                sw.Stop();
                System.Console.WriteLine("10000 search ok. Duration={0} number={1}", sw.ElapsedMilliseconds, number);

            }
        }