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(); }
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(); }
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(); }
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."); }
public string Decode(int cod) { long off = (long)str_offsets.GetByIndex(cod); return((string)((object[])table.GetElement(off))[1]); }
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."); }
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."); }
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."); }