예제 #1
0
        public void Build()
        {
            int nelements = (int)table.Count();

            int[]  keys     = new int[nelements];
            long[] arr_offs = new long[nelements];
            for (int i = 0; i < nelements; i++)
            {
                long off = i == 0 ? 8L : table.ElementOffset();
                arr_offs[i] = off;
                object v = table.GetElement(off);
                //arr_triples[i] = v;
                keys[i] = keyFunc(v);
            }
            Array.Sort(keys, arr_offs);

            scaleFunc = Scale.GetDiaFunc32(keys);

            // Записываем итог
            index_spo.Clear();
            for (int i = 0; i < nelements; i++)
            {
                index_spo.AppendElement(new object[] { keys[i], arr_offs[i] });
            }
            index_spo.Flush();
        }
예제 #2
0
        public void Build()
        {
            int nelements = (int)table.Count();

            int[]  keys     = new int[nelements];
            long[] arr_offs = new long[nelements];
            for (int i = 0; i < nelements; i++)
            {
                long off = i == 0 ? 8L : table.ElementOffset();
                arr_offs[i] = off;
                object v = table.GetElement(off);
                //arr_triples[i] = v;
                keys[i] = keyFunc(v);
            }
            Array.Sort(keys, arr_offs);

            scaleFunc = Scale.GetDiaFunc32(keys);

            object[] arr_triples = new object[nelements];
            // Выделяем группы одинаковых ключей и сортируем по компаратору
            int index       = 0;
            int length      = 0;
            int current_key = keys[index];

            for (int i = 0; i < nelements; i++)
            {
                int key = keys[i];
                if (key == current_key)
                {
                    length++;
                }
                else
                {
                    if (length > 39)
                    {
                        LocalSort(arr_offs, arr_triples, index, length);
                    }
                    // начинается новый блок
                    index       = i;
                    length      = 1;
                    current_key = key;
                }
            }
            if (length > 39)
            {
                LocalSort(arr_offs, arr_triples, index, length);
            }

            // Записываем итог
            index_spo.Clear();
            for (int i = 0; i < nelements; i++)
            {
                index_spo.AppendElement(new object[] { keys[i], arr_offs[i] });
            }
            index_spo.Flush();
        }
예제 #3
0
        // ==================== Динамика ===================
        private int SetStr(string s)
        {
            int  code = (int)table.Count();
            long off  = table.AppendElement(new object[] { code, s });

            str_offsets.AppendElement(off);
            dyna_index.Add(s, code);
            // нужен итоговый Flush по двум последовательностям
            return(code);
        }
예제 #4
0
        public void Build()
        {
            int nelements = (int)table.Count();

            object[] arr_triples = new object[nelements];
            long[]   arr_offs    = new long[nelements];
            for (int i = 0; i < nelements; i++)
            {
                long off = i == 0 ? 8L : table.ElementOffset();
                arr_offs[i] = off;
                object v = table.GetElement(off);
                arr_triples[i] = v;
            }
            Array.Sort(arr_triples, arr_offs, spo_comparer);
            index_spo.Clear();
            for (int i = 0; i < nelements; i++)
            {
                index_spo.AppendElement(arr_offs[i]);
            }
            index_spo.Flush();
        }
예제 #5
0
        // ==================== Динамика ===================

        /// <summary>
        /// Добавление НОВОГО имени, получение кода
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        private int SetStr(string s)
        {
            // Новый код определяется, записывается в основную таблицу, записывается в таблицу офсетов, записывается в динамический индекс
            int  code = (int)cod_str.Count();
            long off  = cod_str.AppendElement(new object[] { code, s });

            offsets.AppendElement(off);
            if (dyna_index.Count > 100_000_000)
            {
                System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                Flush();
                Build();
                sw.Stop();
                Console.WriteLine($"Build() {sw.ElapsedMilliseconds}");
            }
            else
            {
                dyna_index.Add(s, code);
            }
            // нужен итоговый Flush по двум последовательностям
            return(code);
        }
예제 #6
0
        public static void Main402()
        {
            Console.WriteLine("Start Main402");
            // Создадим типы записи и последовательности записей
            PType tp_rec = new PTypeRecord(
                new NamedType("id", new PType(PTypeEnumeration.integer)),
                new NamedType("name", new PType(PTypeEnumeration.sstring)),
                new NamedType("age", new PType(PTypeEnumeration.integer)));
            PType tp_seq = new PTypeSequence(tp_rec);

            // ======== Универсальная последовательность ==========
            Stream stream = File.Open(datadirectory_path + "first_data.bin", FileMode.OpenOrCreate);
            UniversalSequenceBase sequence = new UniversalSequenceBase(tp_rec, stream);

            Random rnd       = new Random();
            int    nelements = 100_000;

            // Последовательность создается пустой или она может быть очищена
            sequence.Clear();
            // В последовательность можно добавлять элементы в объектном представлении
            for (int i = 0; i < nelements; i++)
            {
                sequence.AppendElement(new object[] { i, "Иванов" + i, rnd.Next(1, 110) });
            }

            // Серию записей обязательно надо завершать сбросом буферов
            sequence.Flush();

            // Изучим полученную последовательность
            Console.WriteLine($"Count={sequence.Count()}");
            foreach (object[] r in sequence.ElementValues().Skip(50_000).Take(20))
            {
                Console.WriteLine($"{r[0]} {r[1]} {r[2]} ");
            }

            // При заполнении массива, сохраним офсеты элементов в массиве
            long[] offsets = new long[nelements];
            int[]  keys    = new int[nelements];
            sequence.Clear();
            for (int i = 0; i < nelements; i++)
            {
                int key = nelements - i - 1;
                offsets[i] = sequence.AppendElement(new object[] { key, "Иванов" + key, rnd.Next(1, 110) });
                keys[i]    = key;
            }

            // отсортируем пару массивов keys, offsets по ключам
            Array.Sort(keys, offsets);

            // Будем делать выборку элементов по ключу
            sw.Restart();
            int ntests = 10_000;

            for (int j = 0; j < ntests; j++)
            {
                int      key    = rnd.Next(nelements);
                int      ind    = Array.BinarySearch(keys, key);
                long     off    = offsets[ind];
                object[] fields = (object[])sequence.GetElement(off);
                //Console.WriteLine($"key={key} {fields[0]} {fields[1]} {fields[2]}");
            }
            sw.Stop();
            Console.WriteLine($"duration of {ntests} tests is {sw.ElapsedMilliseconds} ms.");
        }
예제 #7
0
        public static void Main302()
        {
            Console.WriteLine("Start Main302");
            // Создадим типы записи и последовательности записей
            PType tp_rec = new PTypeRecord(
                new NamedType("id", new PType(PTypeEnumeration.integer)),
                new NamedType("name", new PType(PTypeEnumeration.sstring)),
                new NamedType("age", new PType(PTypeEnumeration.integer)));
            PType tp_seq = new PTypeSequence(tp_rec);

            // ======== Универсальная последовательность ==========
            Stream stream = File.Open(datadirectory_path + "first_data.bin", FileMode.OpenOrCreate);
            UniversalSequenceBase sequence = new UniversalSequenceBase(tp_rec, stream);

            Random rnd       = new Random();
            int    nelements = 10_000_000;

            // Последовательность создается пустой или она может быть очищена
            sequence.Clear();
            // В последовательность можно добавлять элементы в объектном представлении
            for (int i = 0; i < nelements; i++)
            {
                sequence.AppendElement(new object[] { i, "Иванов" + i, rnd.Next(1, 110) });
            }

            // Серию записей обязательно надо завершать сбросом буферов
            sequence.Flush();

            // Изучим полученную последовательность
            Console.WriteLine($"Count={sequence.Count()}");
            foreach (object[] r in sequence.ElementValues().Skip(50_000).Take(20))
            {
                Console.WriteLine($"{r[0]} {r[1]} {r[2]} ");
            }

            sw.Restart();
            long sum = 0;

            foreach (object[] r in sequence.ElementValues())
            {
                sum += (int)r[2];
            }
            sw.Stop();
            Console.WriteLine($"scan of {nelements} duration {sw.ElapsedMilliseconds} ms. sum={sum}");

            sw.Restart();
            sum = 0;
            foreach (object[] r in Enumerable.Range(0, nelements).Select(i => new object[] { i, "Иванов" + i, 55 }))
            {
                sum += (int)r[2];
            }
            sw.Stop();
            Console.WriteLine($"object flow generation of {nelements} duration {sw.ElapsedMilliseconds} ms. sum={sum}");

            sw.Restart();
            sum = 0;
            foreach (var r in Enumerable.Range(0, nelements).Select(i => new AAA()
            {
                id = i, name = "Иванов" + i, age = rnd.Next(1, 110)
            }))
            {
                sum += (int)r.age;
            }
            sw.Stop();
            Console.WriteLine($"struct flow generation of {nelements} duration {sw.ElapsedMilliseconds} ms. sum={sum}");

            sw.Restart();
            sum = 0;
            foreach (var r in Enumerable.Range(0, nelements).Select(i => new Tuple <int, string, int>(i, "Иванов" + i, rnd.Next(1, 110))))
            {
                sum += r.Item3;
            }
            sw.Stop();
            Console.WriteLine($"tuple flow generation of {nelements} duration {sw.ElapsedMilliseconds} ms. sum={sum}");

            sw.Restart();
            sum = 0;
            foreach (var r in Enumerable.Range(0, nelements).Select(i => new Tuple <int, long, int>(i, (long)i, rnd.Next(1, 110))))
            {
                sum += r.Item3;
            }
            sw.Stop();
            Console.WriteLine($"allint tuple flow generation of {nelements} duration {sw.ElapsedMilliseconds} ms. sum={sum}");

            sw.Restart();
            sum = 0;
            foreach (var r in Enumerable.Range(0, nelements).Select(i => new object[] { i, (long)i, rnd.Next(1, 110) }))
            {
                sum += (int)r[2];
            }
            sw.Stop();
            Console.WriteLine($"allint object flow generation of {nelements} duration {sw.ElapsedMilliseconds} ms. sum={sum}");

            sw.Restart();
            sum = 0;
            foreach (var r in Enumerable.Range(0, nelements).Select(i => 55))
            {
                sum += (int)r;
            }
            sw.Stop();
            Console.WriteLine($"int flow generation of {nelements} duration {sw.ElapsedMilliseconds} ms. sum={sum}");

            //scan of 10000000 duration 2133 ms.sum = 549806436
            //object flow generation of 10000000 duration 858 ms.sum = 550000000
            //struct flow generation of 10000000 duration 810 ms.sum=550058422
            //tuple flow generation of 10000000 duration 837 ms.sum=549922381
            //allint tuple flow generation of 10000000 duration 279 ms.sum=550001434
            //allint object flow generation of 10000000 duration 501 ms.sum=549901363
            //int flow generation of 10000000 duration 118 ms.sum=550000000
            return;

            // При заполнении массива, сохраним офсеты элементов в массиве
            long[] offsets = new long[nelements];
            int[]  keys    = new int[nelements];
            sequence.Clear();
            for (int i = 0; i < nelements; i++)
            {
                int key = nelements - i - 1;
                offsets[i] = sequence.AppendElement(new object[] { key, "Иванов" + key, rnd.Next(1, 110) });
                keys[i]    = key;
            }

            // отсортируем пару массивов keys, offsets по ключам
            Array.Sort(keys, offsets);

            // Будем делать выборку элементов по ключу
            sw.Restart();
            int ntests = 10_000;

            for (int j = 0; j < ntests; j++)
            {
                int      key    = rnd.Next(nelements);
                int      ind    = Array.BinarySearch(keys, key);
                long     off    = offsets[ind];
                object[] fields = (object[])sequence.GetElement(off);
                //Console.WriteLine($"key={key} {fields[0]} {fields[1]} {fields[2]}");
            }
            sw.Stop();
            Console.WriteLine($"duration of {ntests} tests is {sw.ElapsedMilliseconds} ms.");
        }