private void LoadQuadsAndN4() { n4.StartSerialFlow(); n4.S(); quads.StartSerialFlow(); quads.S(); foreach (var tri in triplets.Root.Elements()) { object[] tri_uni = (object[])tri.Get(); int tag = (int)tri_uni[0]; object[] rec = (object[])tri_uni[1]; int hs_s = ((string)rec[0]).GetHashCode(); int hs_p = ((string)rec[1]).GetHashCode(); if (tag == 1) // объектое свойство { int hs_o = ((string)rec[2]).GetHashCode(); quads.V(new object[] { hs_s, 0, hs_p, tri.offset }); quads.V(new object[] { hs_o, 1, hs_p, tri.offset }); } else // поле данных { quads.V(new object[] { hs_s, 2, hs_p, tri.offset }); if ((string)rec[1] != sema2012m.ONames.p_name) { continue; } // Поместим информацию в таблицу имен n4 string name = (string)rec[2]; string name4 = name.Length <= 4 ? name : name.Substring(0, 4); n4.V(new object[] { hs_s, name4.ToLower().GetHashCode() }); } } quads.Se(); quads.EndSerialFlow(); n4.Se(); n4.EndSerialFlow(); // Сохранение quads.Flush(); n4.Flush(); }
public void Load(int numb) { cell.Clear(); int portion = 200; cell.StartSerialFlow(); cell.S(); for (int i = 0; i < numb / portion; i++) { if (i % 1000 == 0) { Console.WriteLine("{0}%", (double)i * 100.0 / (double)numb * (double)portion); } for (int j = 0; j < portion; j++) { int value = i * portion + j; // rnd.Next(); cell.V(value); } } cell.Se(); cell.EndSerialFlow(); cell.Flush(); }
private void LoadQuadsAndSort() { n4.StartSerialFlow(); n4.S(); quads.StartSerialFlow(); quads.S(); foreach (var tri in triplets.Root.Elements()) { object[] tri_uni = (object[])tri.Value; int tag = (int)tri_uni[0]; object[] rec = (object[])tri_uni[1]; int hs_s = ((string)rec[0]).GetHashCode(); int hs_p = ((string)rec[1]).GetHashCode(); if (tag == 1) // объектое свойство { int hs_o = ((string)rec[2]).GetHashCode(); quads.V(new object[] { hs_s, 0, hs_p, tri.Offset }); quads.V(new object[] { hs_o, 1, hs_p, tri.Offset }); } else // поле данных { quads.V(new object[] { hs_s, 2, hs_p, tri.Offset }); if ((string)rec[1] != sema2012m.ONames.p_name) { continue; } // Поместим информацию в таблицу имен n4 string name = (string)rec[2]; string name4 = name.Length <= 4 ? name : name.Substring(0, 4); n4.V(new object[] { hs_s, name4.ToLower() }); } } quads.Se(); quads.EndSerialFlow(); n4.Se(); n4.EndSerialFlow(); // Сортировка квадриков quads.Root.Sort((o1, o2) => { object[] v1 = (object[])o1; object[] v2 = (object[])o2; int e1 = (int)v1[0]; int e2 = (int)v2[0]; int q1 = (int)v1[1]; int q2 = (int)v2[1]; int p1 = (int)v1[2]; int p2 = (int)v2[2]; return(e1 < e2 ? -3 : (e1 > e2 ? 3 : (q1 < q2 ? -2 : (q1 > q2 ? 2 : (p1 < p2 ? -1 : (p1 > p2 ? 1 : 0)))))); }); // Сортировка таблицы имен n4.Root.Sort((o1, o2) => { object[] v1 = (object[])o1; object[] v2 = (object[])o2; string s1 = (string)v1[1]; string s2 = (string)v2[1]; return(s1.CompareTo(s2)); }); }
private int MakeTreeFree(PaCell otriples, PaCell otriples_op, PaCell dtriples_sp) { // Делаю три сканера из трех ячеек DiapasonScanner <SubjPredInt> fields = new DiapasonScanner <SubjPredInt>(dtriples_sp, ent => { object[] v = (object[])ent.Get(); return(new SubjPredInt() { subj = (int)v[0], pred = (int)v[1] }); }); DiapasonScanner <SubjPredInt> direct = new DiapasonScanner <SubjPredInt>(otriples, ent => { object[] v = (object[])ent.Get(); return(new SubjPredInt() { subj = (int)v[0], pred = (int)v[1] }); }); DiapasonScanner <SubjPredInt> inverse = new DiapasonScanner <SubjPredInt>(otriples_op, ent => { object[] v = (object[])ent.Get(); return(new SubjPredInt() { subj = (int)v[2], pred = (int)v[1] }); }); // Стартуем сканеры fields.Start(); direct.Start(); inverse.Start(); // Заведем ячейку для результата сканирования PaCell tree_free = new PaCell(tp_entitiesTree, path + "tree_free.pac", false); tree_free.Clear(); int cnt_e = 0, cnt_ep = 0; // для отладки long c1 = 0, c2 = 0, c3 = 0; // для отладки //PaEntry ent_dtriples = dtriples.Root.Element(0); // вход для доступа к литералам // Начинаем тройное сканирование tree_free.StartSerialFlow(); tree_free.S(); while (fields.HasValue || direct.HasValue || inverse.HasValue) { // Здесь у нас НОВОЕ значение идентификатора cnt_e++; if (cnt_e % 10000000 == 0) { Console.Write("{0} ", cnt_e / 10000000); } int id0 = fields.HasValue ? fields.KeyCurrent.subj : Int32.MaxValue; int id1 = direct.HasValue ? direct.KeyCurrent.subj : Int32.MaxValue; int id2 = inverse.HasValue ? inverse.KeyCurrent.subj : Int32.MaxValue; // Минимальное значение кода идентификатора int id = Math.Min(id0, Math.Min(id1, id2)); // Начало записи tree_free.R(); // Запись идентификатора tree_free.V(id); tree_free.S(); while (fields.HasValue && fields.KeyCurrent.subj == id) { int su = fields.KeyCurrent.subj; int pr = fields.KeyCurrent.pred; var diap = fields.Next(); c3 += diap.numb; for (long ind = diap.start; ind < diap.start + diap.numb; ind++) { object[] row = (object[])dtriples_sp.Root.Element(ind).Get(); int subj = (int)row[0]; int prop = (int)row[1]; long off = (long)row[2]; if (subj != su || prop != pr) { throw new Exception("Assert err: 287282"); } tree_free.V(new object[] { prop, off }); } } tree_free.Se(); tree_free.S(); while (direct.HasValue && direct.KeyCurrent.subj == id) { int su = direct.KeyCurrent.subj; int pr = direct.KeyCurrent.pred; var diap = direct.Next(); c1 += diap.numb; for (long ind = diap.start; ind < diap.start + diap.numb; ind++) { object[] row = (object[])otriples.Root.Element(ind).Get(); int subj = (int)row[0]; int prop = (int)row[1]; int obj = (int)row[2]; if (subj != su || prop != pr) { throw new Exception("Assert err: 287283"); } tree_free.V(new object[] { prop, obj }); } } tree_free.Se(); tree_free.S(); while (inverse.HasValue && inverse.KeyCurrent.subj == id) { int su = inverse.KeyCurrent.subj; int pr = inverse.KeyCurrent.pred; var diap = inverse.Next(); c2 += diap.numb; tree_free.R(); tree_free.V(pr); tree_free.S(); for (long ind = diap.start; ind < diap.start + diap.numb; ind++) { object[] row = (object[])otriples_op.Root.Element(ind).Get(); int subj = (int)row[0]; int prop = (int)row[1]; int obj = (int)row[2]; if (obj != su || prop != pr) { throw new Exception("Assert err: 287284"); } tree_free.V(subj); } tree_free.Se(); tree_free.Re(); } tree_free.Se(); // Конец записи tree_free.Re(); } tree_free.Se(); tree_free.EndSerialFlow(); return(cnt_e); }
// Из XML базы данных, выбирается множество RDF-дуг (DatatypeProperty) с предикатом http://fogid.net/o/name и формируется // последовательность пар (записей) имя-сущности - идентификатор сущности. Задача заключается в том, чтобы по частичному // имени, определить множество идентификаторов сущностей, для которых имеется похожее имя public static void Main(string[] args) { string path = @"..\..\..\Databases\"; // Тестирование сортировки по ключу со слиянием PaEntry.bufferBytes = 40; PaCell cell_simple = new PaCell(new PTypeSequence(new PType(PTypeEnumeration.integer)), path + "cimple.pac", false); cell_simple.Clear(); object[] arr = { 97, 1, 3, 2, 4, 9, 8, 7, 6, 0, 5, 99, 98 }; cell_simple.Fill(arr); cell_simple.Flush(); Console.WriteLine(cell_simple.Type.Interpret(cell_simple.Root.Get())); cell_simple.Root.SortByKey <int>(i_key => (int)i_key); Console.WriteLine(cell_simple.Type.Interpret(cell_simple.Root.Get())); return; PType tp_seq = new PTypeSequence(new PTypeRecord( new NamedType("name", new PType(PTypeEnumeration.sstring)), new NamedType("id", new PType(PTypeEnumeration.sstring)))); DateTime tt0 = DateTime.Now; Console.WriteLine("Start"); PaCell cella = new PaCell(tp_seq, path + "cella.pac", false); cella.Clear(); // Заполним ячейку данными XElement db = XElement.Load(path + "0001.xml"); cella.StartSerialFlow(); cella.S(); foreach (XElement rec in db.Elements()) { XAttribute about_att = rec.Attribute(sema2012m.ONames.rdfabout); if (about_att == null) { continue; } foreach (XElement prop in rec.Elements().Where(pr => pr.Name.LocalName == "name")) { cella.V(new object[] { prop.Value, about_att.Value }); } } cella.Se(); cella.EndSerialFlow(); // Проверим, что данные прочитались (должно получится 40361 пар имя-идентификатор) Console.WriteLine(cella.Root.Count()); // Надо перевести данные в фиксированный формат PxCell cell_seqnameid = new PxCell(tp_seq, path + "seqnameid.pxc", false); // очистим и перекинем данные cell_seqnameid.Clear(); cell_seqnameid.Fill2(cella.Root.Get()); Console.WriteLine("======Fill ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; //// Теперь сортируем пары по первому (нулевому) полю //cell_seqnameid.Root.SortComparison((e1, e2) => //{ // string s1 = (string)e1.Field(0).Get(); // string s2 = (string)e2.Field(0).Get(); // return s1.CompareTo(s2); //}); //Console.WriteLine("======Sort ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // Сортируем по-другому cell_seqnameid.Root.Sort(e => { return((string)e.Field(0).Get()); }); Console.WriteLine("======Sort2 ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // Посмотрим первые 100 var qu = cell_seqnameid.Root.Elements().Skip(100).Take(10); foreach (var c in qu) { var v = c.GetValue(); Console.WriteLine(v.Type.Interpret(v.Value)); } Console.WriteLine("======First 10 after 100. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // поищем чего-нибудь string name = "Марчук Александр Гурьевич"; var found = cell_seqnameid.Root.BinarySearchFirst(e => { string nm = (string)e.Field(0).Get(); return(nm.CompareTo(name)); }); var f = found.GetValue(); Console.WriteLine(f.Type.Interpret(f.Value)); Console.WriteLine("======BinarySearchFirst. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // поищем по-другому string name2 = "марчук"; var found2 = cell_seqnameid.Root.BinarySearchFirst(e => { string nm = ((string)e.Field(0).Get()).ToLower(); if (nm.StartsWith(name2)) { return(0); } return(nm.CompareTo(name)); }); var f2 = found.GetValue(); Console.WriteLine(f2.Type.Interpret(f2.Value)); Console.WriteLine("======BinarySearchFirst variant 2. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // Поиск всех, удовлетворяющих условию string name3 = "белинский"; var found3 = cell_seqnameid.Root.BinarySearchAll(e => { string nm = ((string)e.Field(0).Get()).ToLower(); if (nm.StartsWith(name3)) { return(0); } return(nm.CompareTo(name3)); }); foreach (var ff in found3) { var f3 = ff.GetValue(); Console.WriteLine(f3.Type.Interpret(f3.Value)); } Console.WriteLine("======BinarySearchAll ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // Проверка "вручную" правильности поиска всех var query = cell_seqnameid.Root.Elements(); foreach (var rec in query) { object[] value = (object[])rec.Get(); string nam = ((string)value[0]).ToLower(); if (nam.StartsWith(name3)) { Console.WriteLine("{0} {1}", value[0], value[1]); } } Console.WriteLine("======Fin. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; cella.Close(); cell_seqnameid.Close(); System.IO.File.Delete(path + "cella.pac"); System.IO.File.Delete(path + "seqnameid.pxc"); }