예제 #1
0
 public KVStorage32(PType tp, Func <Stream> medias)
 {
     this.tp = tp;
     //table = new BearingPure(tp, medias);
     table         = new BearingDeletable(tp, medias);
     key_index     = new IndexKey32Comp(medias, table, ob => true, ob => (int)((object[])ob)[0], null);
     table.Indexes = new IIndex[] { key_index };
 }
예제 #2
0
        public static void Demo102()
        {
            Console.WriteLine("Start Demo201: work with bearing sequence");
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            // Определим тип
            PType tp_person = new PTypeRecord(
                new NamedType("id", new PType(PTypeEnumeration.integer)),
                new NamedType("name", new PType(PTypeEnumeration.sstring)),
                new NamedType("age", new PType(PTypeEnumeration.integer)));
            // Нам поднадобится несколько стримов, соорудим генератор
            //string dbpath = @"D:/Home/data/GetStarted/";
            int           istream   = 0;
            Func <Stream> GenStream = () =>
            {
                Stream fs = File.Open(dbpath + "d102_" + istream + ".bin", FileMode.OpenOrCreate, FileAccess.ReadWrite);
                istream++;
                return(fs);
            };
            // Создадим опорную последовательность или присоединимся к ней
            BearingDeletable table = new BearingDeletable(tp_person, GenStream);
            // Создадим ключевой индекс
            IndexKey32Comp index_id = new IndexKey32Comp(GenStream, table,
                                                         ob => true,
                                                         ob => (int)((object[])ob)[0],
                                                         null);

            // Присоединим индекс к таблице
            table.Indexes = new IIndex[] { index_id };
            // Создадим генератор данных, данными будут персоны, а нумерация - по убыванию
            Random rnd = new Random();
            Func <int, IEnumerable <object> > GenPers = nper => Enumerable.Range(0, nper)
                                                        .Select(i => new object[] { nper - i - 1, "_" + (nper - i - 1), rnd.Next(130) });
            // Будут ветви загрузки и присоединения
            bool toload   = true;
            int  npersons = 1_000_000;

            sw.Restart();
            if (toload)
            {
                table.Clear();
                table.Load(GenPers(npersons));
                table.Build();
            }
            else // присоединяемся к имеющейся
            {
                table.Refresh();
            }
            sw.Stop();
            Console.WriteLine($"load/refresh ok. duration={sw.ElapsedMilliseconds}");

            // Надем элемент по коду
            int code    = npersons * 2 / 3;
            var results = index_id.GetAllByKey(code);

            foreach (object res in results)
            {
                Console.WriteLine(tp_person.Interpret(res));
            }

            // Измерим скорость выборок
            sw.Restart();
            int nprobe = 10000;

            for (int i = 0; i < nprobe; i++)
            {
                int c      = rnd.Next(npersons);
                var result = index_id.GetAllByKey(c).FirstOrDefault();
                if (result == null)
                {
                    throw new Exception("Err: 18371");
                }
            }

            sw.Stop();
            Console.WriteLine($"{nprobe} GetAllByKey ok. duration={sw.ElapsedMilliseconds}");

            // Результаты: для 1 млн. персон загрузка 1260 мс., выборки 120 мс/10000, refresh 237 мс. (повторно 7 мс.)
        }
예제 #3
0
        public TripleStoreInt32(Func <Stream> stream_gen, string tmp_dir_path)
        {
            // сначала таблица имен
            nt = new Nametable32(stream_gen);
            // Предзагрузка должна быть обеспечена даже для пустой таблицы имен
            PreloadFognames();
            // Тип Object Variants
            PType tp_ov = new PTypeUnion(
                new NamedType("dummy", new PType(PTypeEnumeration.none)),
                new NamedType("iri", new PType(PTypeEnumeration.integer)),
                new NamedType("str", new PType(PTypeEnumeration.sstring))
                //new NamedType("int", new PType(PTypeEnumeration.sstring)),
                //new NamedType("date", new PType(PTypeEnumeration.sstring)),
                //new NamedType("langstr", new PTypeRecord(
                //    new NamedType("lang", new PType(PTypeEnumeration.sstring)),
                //    new NamedType("str", new PType(PTypeEnumeration.sstring))))
                );
            PType tp_triple = new PTypeRecord(
                new NamedType("subj", new PType(PTypeEnumeration.integer)),
                new NamedType("pred", new PType(PTypeEnumeration.integer)),
                new NamedType("obj", tp_ov));

            // Главная последовательность кодированных триплетов
            //table = new UniversalSequenceBase(tp_triple, stream_gen());
            table = new BearingDeletable(tp_triple, stream_gen);

            // прямой ссылочный индекс
            s_index = new IndexKey32Comp(stream_gen, table, ob => true,
                                         ob => (int)((object[])ob)[0], null);

            // Обратный ссылочный индекс
            inv_index = new IndexKey32Comp(stream_gen, table,
                                           ob => (int)((object[])((object[])ob)[2])[0] == 1,
                                           obj =>
            {
                object[] pair = (object[])((object[])obj)[2];
                return((int)pair[1]);
            }, null);

            // Индекс по тексту объектов триплетов с предикатом http://fogid.net/o/name
            //int p_name = Int32.MinValue;
            Comparer <object> comp = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                return(string.Compare(
                           (string)((object[])((object[])a)[2])[1],
                           (string)((object[])((object[])b)[2])[1], StringComparison.OrdinalIgnoreCase));
            }));

            int cod_name = nt.GetSetStr("http://fogid.net/o/name");

            name_index = new IndexView(stream_gen, table, ob => (int)((object[])ob)[1] == cod_name, comp);

            comp_like = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                int len = ((string)((object[])((object[])b)[2])[1]).Length;
                return(string.Compare(
                           (string)((object[])((object[])a)[2])[1], 0,
                           (string)((object[])((object[])b)[2])[1], 0, len, StringComparison.OrdinalIgnoreCase));
            }));

            table.Indexes = new IIndex[] { s_index, inv_index, name_index };
        }
예제 #4
0
        public static void Demo103()
        {
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            Random rnd = new Random();

            Console.WriteLine("Start Main18: bearing experiments");
            int           cnt       = 0;
            Func <Stream> GenStream = () => new FileStream(dbpath + "f" + (cnt++) + ".bin",
                                                           FileMode.OpenOrCreate, FileAccess.ReadWrite);
            PType tp_elem = new PTypeRecord(
                new NamedType("id", new PType(PTypeEnumeration.integer)),
                new NamedType("name", new PType(PTypeEnumeration.sstring)),
                new NamedType("age", new PType(PTypeEnumeration.integer)));

            //BearingPure table = new BearingPure(tp_elem, GenStream);
            BearingDeletable  table = new BearingDeletable(tp_elem, GenStream);
            Comparer <object> comp  = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                return(string.Compare((string)((object[])a)[1], (string)((object[])b)[1]));
            }));

            table.Indexes = new IIndex[]
            {
                new IndexKey32Comp(GenStream, table, obj => true,
                                   obj => (int)((object[])obj)[0], null),
                new IndexView(GenStream, table, obj => true,
                              comp)
                {
                    tmpdir = dbpath, volume_of_offset_array = 20_000_000
                }
            };

            int  nelements = 1_000_000;
            bool toload    = true;

            if (toload)
            {
                sw.Restart();
                table.Clear();
                int n = nelements;
                table.Load(
                    Enumerable.Range(0, nelements)
                    .Select(i => new object[] { (n - i - 1), "" + (n - i - 1), 33 })
                    );
                sw.Stop();
                Console.WriteLine($"load {nelements} ok. duration={sw.ElapsedMilliseconds}");
            }
            else
            {
                sw.Restart();
                table.Refresh();
                sw.Stop();
                Console.WriteLine($"refresh {nelements} ok. duration={sw.ElapsedMilliseconds}");
            }

            int            key      = nelements * 2 / 3;
            IndexKey32Comp id_index = (IndexKey32Comp)table.Indexes[0];
            var            obs      = id_index.GetAllByKey(key);

            Console.WriteLine("Test of IndexKey32Comp");
            foreach (var ob in obs)
            {
                Console.WriteLine(tp_elem.Interpret(ob));
            }


            IndexView name_index = (IndexView)table.Indexes[1];
            // Экспермент по поиску похожих
            Comparer <object> comp_like = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                int len = ((string)((object[])b)[1]).Length;
                return(string.Compare((string)((object[])a)[1], 0, (string)((object[])b)[1], 0, len));
            }));

            Console.WriteLine("Test of SearchAll");
            var quer = name_index.SearchAll(new object[] { -1, "" + (key / 10), -1 }, comp_like);

            foreach (var ob in quer)
            {
                Console.WriteLine("~~" + tp_elem.Interpret(ob));
            }

            int nprobes = 1000;

            sw.Restart();
            int total = 0;

            for (int i = 0; i < nprobes; i++)
            {
                int ke = rnd.Next(nelements);
                total += id_index.GetAllByKey(ke).Count();
            }
            sw.Stop();
            Console.WriteLine($"GetAllByKey: {nprobes} probes ok. duration={sw.ElapsedMilliseconds} total={total}");

            sw.Restart();
            total = 0;
            rnd   = new Random(7654331);
            for (int i = 0; i < nprobes; i++)
            {
                int ke = rnd.Next(nelements);
                total += name_index.SearchAll(new object[] { -1, "" + (ke), -1 },
                                              comp_like).Count();
                //comp).Count();
            }
            sw.Stop();
            Console.WriteLine($"SearchAll: {nprobes} probes ok. duration={sw.ElapsedMilliseconds} total={total}");
        }
예제 #5
0
        public TripleRecordStore(Func <Stream> stream_gen, string tmp_dir_path, string[] preload_names)
        {
            // сначала таблица имен
            nt = new Nametable32(stream_gen);
            // Предзагрузка откладывается
            this.preload_names = preload_names;
            //LoadPreloadnames(); // Это потом

            // Тип записи
            PType tp_record = new PTypeRecord(
                new NamedType("id", new PType(PTypeEnumeration.integer)),
                new NamedType("directs",
                              new PTypeSequence(new PTypeRecord(
                                                    new NamedType("prop", new PType(PTypeEnumeration.integer)),
                                                    new NamedType("entity", new PType(PTypeEnumeration.integer))))),
                new NamedType("fields",
                              new PTypeSequence(new PTypeRecord(
                                                    new NamedType("prop", new PType(PTypeEnumeration.integer)),
                                                    new NamedType("value", new PType(PTypeEnumeration.sstring)),
                                                    new NamedType("lang", new PType(PTypeEnumeration.sstring)))))
                );

            // Главная последовательность: множестов кодированных записей
            table = new BearingDeletable(tp_record, stream_gen);
            // прямой ключевой индекс: по задаваемому ключу получаем запись
            s_index = new IndexKey32Comp(stream_gen, table, ob => true,
                                         ob => (int)((object[])ob)[0], null);
            // Обратный ссылочный индекс
            inv_index = new IndexKey32CompVector(stream_gen, table,
                                                 obj =>
            {
                object[] directs = (object[])((object[])obj)[1];
                return(directs.Cast <object[]>()
                       .Select(pair => (int)pair[1]));
            }, null);


            // Это компаратор сортировки. (более ранний комментарий: компаратор надо поменять!!!!!!)
            Comparer <object> comp = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                object predval1 = ((object[])((object[])a)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name);
                object predval2 = ((object[])((object[])b)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name);

                return(string.Compare(
                           (string)((object[])predval1)[1],
                           (string)((object[])predval2)[1],
                           StringComparison.OrdinalIgnoreCase));
            }));

            comp_like = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                string val1 = (string)((object[])((object[])((object[])a)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name))[1];
                string val2 = (string)((object[])((object[])((object[])b)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name))[1];
                if (string.IsNullOrEmpty(val2))
                {
                    return(0);
                }
                int len = val2.Length;
                return(string.Compare(
                           val1, 0,
                           val2, 0, len, StringComparison.OrdinalIgnoreCase));
            }));

            // name-индекс пока будет скалярным и будет индексировать первое (!) name-поле в записи
            name_index = new IndexView(stream_gen, table,
                                       ob => ((object[])((object[])ob)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name) != null, comp)
            {
                tmpdir = tmp_dir_path, volume_of_offset_array = 20_000_000
            };

            table.Indexes = new IIndex[] { s_index, inv_index, name_index };
        }