Пример #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
        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();
        }
Пример #4
0
        public static void Main303()
        {
            Console.WriteLine("Start Main303");
            // Создадим типы записи и последовательности записей
            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 + "data303.bin", FileMode.OpenOrCreate);
            UniversalSequenceBase sequence = new UniversalSequenceBase(tp_rec, stream);

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

            // При заполнении массива, сохраним офсеты элементов в массиве
            long[] offsets = new long[nelements];
            int[]  keys    = new int[nelements];

            bool toload = true;

            if (toload)
            {
                sw.Restart();
                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.Stop();
                Console.WriteLine($"Load of {nelements} elements. duration={sw.ElapsedMilliseconds}");
            }
            else
            {
                int ind = 0;
                sequence.Scan((off, obj) =>
                {
                    offsets[ind] = off;
                    keys[ind]    = (int)((object[])obj)[0];
                    ind++;
                    return(true);
                });
                // отсортируем пару массивов keys, offsets по ключам
                Array.Sort(keys, offsets);
            }



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

            for (int j = 0; j < ntests; j++)
            {
                int      key    = rnd.Next(nelements);
                int      nom    = Array.BinarySearch(keys, key);
                long     off    = offsets[nom];
                object[] fields = (object[])sequence.GetElement(off);
                if (key != (int)fields[0])
                {
                    throw new Exception("1233eddf");
                }
                //Console.WriteLine($"key={key} {fields[0]} {fields[1]} {fields[2]}");
            }
            sw.Stop();
            Console.WriteLine($"duration of {ntests} tests is {sw.ElapsedMilliseconds} ms.");
        }
Пример #5
0
        public string Decode(int cod)
        {
            long off = (long)str_offsets.GetByIndex(cod);

            return((string)((object[])table.GetElement(off))[1]);
        }
Пример #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 Main306()
        {
            Console.WriteLine("Start Main306");
            // Создадим типы записи и последовательности записей
            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 + "data306.bin", FileMode.OpenOrCreate);
            Stream stream2 = File.Open(datadirectory_path + "keys306.bin", FileMode.OpenOrCreate);
            Stream stream3 = File.Open(datadirectory_path + "offsets306.bin", FileMode.OpenOrCreate);
            UniversalSequenceBase sequence  = new UniversalSequenceBase(tp_rec, stream);
            UniversalSequenceBase sequence2 = new UniversalSequenceBase(new PType(PTypeEnumeration.integer), stream2);
            UniversalSequenceBase sequence3 = new UniversalSequenceBase(new PType(PTypeEnumeration.longinteger), stream3);

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

            // При заполнении массива, сохраним офсеты элементов в массиве
            long[] offsets = new long[nelements];
            int[]  keys    = new int[nelements];

            bool toload = true;

            if (toload)
            {
                sw.Restart();
                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;
                }
                sequence.Flush();
                // отсортируем пару массивов keys, offsets по ключам
                Array.Sort(keys, offsets);

                // запишем массивы в последовательности
                sequence2.Clear();
                for (int i = 0; i < nelements; i++)
                {
                    sequence2.AppendElement(keys[i]);
                }
                sequence2.Flush();

                sequence3.Clear();
                for (int i = 0; i < nelements; i++)
                {
                    sequence3.AppendElement(offsets[i]);
                }
                sequence3.Flush();

                sw.Stop();
                Console.WriteLine($"Load of {nelements} elements. duration={sw.ElapsedMilliseconds}");
            }


            // Сначала сделаем единичный тест
            int    k    = nelements * 2 / 3;
            long   ind  = BinarySequenceSearchFirst(0, nelements, k, sequence2);
            long   offf = (long)sequence3.GetByIndex(ind);
            object rec  = sequence.GetElement(offf);

            Console.WriteLine($"k={k}, v={tp_rec.Interpret(rec)}");


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

            for (int j = 0; j < ntests; j++)
            {
                int      key    = rnd.Next(nelements);
                long     nom1   = BinarySequenceSearchFirst(0, nelements, key, sequence2);
                long     off    = (long)sequence3.GetByIndex(nom1);
                object[] fields = (object[])sequence.GetElement(off);
                if (key != (int)fields[0])
                {
                    throw new Exception("1233eddf");
                }
            }
            sw.Stop();
            Console.WriteLine($"duration of {ntests} tests is {sw.ElapsedMilliseconds} ms.");
        }
Пример #8
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.");
        }