Ejemplo n.º 1
0
        /// <summary>
        /// Batch-loading dataitems from storage. Storage determs the most optimal order for loading pointers, so items will be returned in other order than pointers.
        /// </summary>
        public IEnumerable<Tuple<IPtr, byte[]>> BatchLoad(IPtr[] ptrs, int sizeOfbatchInMb = 1024)
        {
            var md5 = new MD5CryptoServiceProvider();
            long sizeOfbatch = ((long) sizeOfbatchInMb)*1024*1024;
            var groupsByFile = ptrs.GroupBy(p => ((Ptr) p).FileNum);
            foreach (var group in groupsByFile)
            {
                var ordered = group.OrderBy(p => ((Ptr) p).Position).ToArray();
                int processed = 0;
                while (processed < ordered.Length)
                {
                    var dbFile = dbFiles[group.Key];
                    List<Tuple<Ptr, byte[], byte[]>> loaded = new List<Tuple<Ptr, byte[], byte[]>>();
                    byte[] data, hash;
                    long readedBytes = 0;
                    lock (dbFile)
                    {
                        while (readedBytes < sizeOfbatch && processed < ordered.Length)
                        {
                            var ptr = (Ptr) ordered[processed];
                            ReadFromDbFile(dbFile, ptr.Capacity, ptr.Position, out data, out hash);
                            loaded.Add(Tuple.Create(ptr, data, hash));
                            if (data != null) readedBytes += data.Length + hash.Length;
                            ++processed;
                        }
                    }
                    foreach (var item in loaded)
                    {
                        var ptr = item.Item1;
                        data = item.Item2;
                        hash = item.Item3;
                        var control = md5.ComputeHash(data);
                        if (!control.SequenceEqual(hash)) yield return new Tuple<IPtr, byte[]>(ptr, null);
                        else yield return new Tuple<IPtr, byte[]>(ptr, data);
                    }
                }        
            }

        }