Пример #1
0
    public static void Main(string[] args)
    {
        SortArrayList list =
            new SortArrayList(new StringComparer());

        list.Add("d");
        list.Add("A");
        list.Add("C");
        list.Add("c");
        list.Add("b");
        list.Add("B");
        list.Add("D");
        list.Add("a");
        list.QuickSort();
        foreach (string s in list)
        {
            Console.WriteLine(s);
        }
    }
        private void LoadKey(string tablename, BigEntityTableMeta meta)
        {
            string indexfile      = GetKeyFile(tablename);
            var    indexmergeinfo = meta.IndexMergeInfos.Find(p => p.IndexName.Equals(meta.KeyName));

            if (indexmergeinfo == null)
            {
                indexmergeinfo           = new IndexMergeInfo();
                indexmergeinfo.IndexName = meta.KeyName;
                meta.IndexMergeInfos.Add(indexmergeinfo);
            }

            //计算加载因子
            indexmergeinfo.LoadFactor = (int)Math.Max(4, new FileInfo(indexfile).Length / MAX_KEYBUFFER);

            int i = 0;
            BigEntityTableIndexItem        lastreadindex = null;
            List <BigEntityTableIndexItem> list          = new List <BigEntityTableIndexItem>();
            long currentpos    = 0;
            long currrankindex = 0;

            byte[] buffer = new byte[1024 * 1024 * 10];
            using (ObjTextReader idx = ObjTextReader.CreateReader(indexfile))
            {
                Console.WriteLine("loadkey");
                foreach (var newindex in idx.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer))
                {
                    if (newindex.Del)
                    {
                        continue;
                    }
                    newindex.KeyOffset  = currentpos;
                    newindex.RangeIndex = currrankindex++;
                    newindex.SetIndex(meta.KeyIndexInfo);
                    if (newindex.KeyOffset >= indexmergeinfo.IndexMergePos)
                    {
                        //list.Add(newindex);
                        if (list.Count > 0)
                        {
                            if (list.Last().KeyOffset != lastreadindex.KeyOffset)
                            {
                                list.Add(lastreadindex);
                            }
                        }
                        break;
                    }

                    if (indexmergeinfo.LoadFactor == 1 || i % indexmergeinfo.LoadFactor == 0)
                    {
                        list.Add(newindex);
                    }
                    i++;
                    lastreadindex = newindex;
                }

                if (list.Count > 0 && list.Last().KeyOffset != lastreadindex.KeyOffset)
                {
                    list.Add(lastreadindex);
                }
            }
            indexmergeinfo.TotalCount = i;

            BigEntityTableIndexItem[] oldindexitems = null;
            keyindexdisklist.TryRemove(tablename, out oldindexitems);
            keyindexdisklist.TryAdd(tablename, list.ToArray());
            using (ObjTextReader idr = ObjTextReader.CreateReader(indexfile))
            {
                Console.WriteLine("loadkey2");

                if (indexmergeinfo.IndexMergePos > 0)
                {
                    idr.SetPostion(indexmergeinfo.IndexMergePos);
                }
                //Dictionary<string, BigEntityTableIndexItem> indexdic = new Dictionary<string, BigEntityTableIndexItem>();
                //keyindexlistdic[tablename];
                SortArrayList <BigEntityTableIndexItem> keymemlist = new SortArrayList <BigEntityTableIndexItem>();
                foreach (var newindex in idr.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer))
                {
                    newindex.KeyOffset = currentpos;
                    newindex.SetIndex(meta.KeyIndexInfo);
                    newindex.RangeIndex = -1;
                    if (!newindex.Del)
                    {
                        //indexdic.Add(newindex.Key, newindex);
                        keymemlist.Add(newindex);
                        i++;
                    }
                }

                var tablelocker = GetKeyLocker(tablename, string.Empty);
                tablelocker.EnterWriteLock();
                try
                {
                    foreach (var newindex in idr.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer))
                    {
                        newindex.KeyOffset = currentpos;
                        newindex.SetIndex(meta.KeyIndexInfo);
                        newindex.RangeIndex = -1;
                        if (!newindex.Del)
                        {
                            //indexdic.Add(newindex.Key, newindex);
                            keymemlist.Add(newindex);
                            i++;
                        }
                    }

                    if (idr.Length() - currentpos > 10240)
                    {
                        throw new Exception(tablename + "主键索引大量数据未读取");
                    }

                    //keyindexlistdic[tablename] = indexdic;
                    keyindexmemlist[tablename] = keymemlist;
                }
                finally
                {
                    tablelocker.ExitWriteLock();
                }
            }
        }
Пример #3
0
        private void TestFind()
        {
            List <string> list  = new List <string>();
            var           first = Guid.NewGuid().ToString("N");

            for (int i = 0; i < 2000000; i++)
            {
                list.Add(Guid.NewGuid().ToString("N"));
                //list.Add(first+i);
            }

            Console.WriteLine("开始排序112");
            DateTime now = DateTime.Now;

            SortArrayList <string> sl = new SortArrayList <string>();
            int j = 0;

            foreach (var ite in list)
            {
                try
                {
                    sl.Add(ite);
                    j++;
                }
                catch (Exception ce)
                {
                    Console.WriteLine(ce.ToString());
                }
            }

            var ms        = DateTime.Now.Subtract(now).TotalMilliseconds;
            var orderlist = sl.GetList().ToList();

            Console.WriteLine("排序完成,用时:" + ms + "ms," + orderlist.Count());

            list.Add(Guid.NewGuid().ToString());
            Console.WriteLine("测试查找");
            now = DateTime.Now;
            int fund = 0;

            foreach (var item in list)
            {
                try
                {
                    var s = sl.Find(item);
                    if (s == null)
                    {
                        Console.WriteLine("查找失败:" + item);
                    }
                    else
                    {
                        fund++;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("查找出错:" + item + ":" + ex.ToString());
                    break;
                }
            }
            Console.WriteLine("查找完成,查找到:" + fund + "个,用时:" + DateTime.Now.Subtract(now).TotalMilliseconds + "ms");
        }
Пример #4
0
        public static void TestString()
        {
            List <string> list  = new List <string>();
            var           first = Guid.NewGuid().ToString("N");

            for (int i = 0; i < 2000000; i++)
            {
                list.Add(Guid.NewGuid().ToString("N"));
                //list.Add(first+i);
            }

            Console.WriteLine("开始排序112");
            DateTime now = DateTime.Now;

            SortArrayList <string> sl = new SortArrayList <string>();
            int j = 0;

            foreach (var ite in list)
            {
                try
                {
                    sl.Add(ite);
                    j++;
                }
                catch (Exception ce)
                {
                    Console.WriteLine(ce.ToString());
                }
            }

            var ms        = DateTime.Now.Subtract(now).TotalMilliseconds;
            var orderlist = sl.GetList().ToList();

            Console.WriteLine("排序完成,用时:" + ms + "ms," + orderlist.Count());

            now = DateTime.Now;
            list.Sort();
            Console.WriteLine("原生排序完成:" + DateTime.Now.Subtract(now).TotalMilliseconds + "ms");

            bool issame = true;

            if (list.Count() == orderlist.Count())
            {
                int i = 0;
                foreach (var item in list)
                {
                    if (item != orderlist[i++])
                    {
                        issame = false;
                        Console.WriteLine("不同:" + i);
                        break;
                    }
                }
            }
            else
            {
                issame = false;
            }
            if (issame)
            {
                Console.WriteLine("排序相同");
            }
            else
            {
                Console.WriteLine("排序不同");
            }
        }