Exemplo n.º 1
0
        public void DiskStorageManager_CanStoreAndLoad()
        {
            var filename       = Path.GetTempFileName();
            var storageManager = new DiskStorageManager(filename);

            storageManager.DatafileSuffix  = "data";
            storageManager.IndexfileSuffix = "index";
            storageManager.Overwrite       = true;
            storageManager.PageSize        = 1024;

            // a random but repeatable seed
            var buffer  = DataHelpers.GenerateSomeBytes(9087449);
            var nAccess = new StorageManagerAccess(storageManager);
            var page1   = nAccess.Store(-1, buffer);

            var buffer2 = DataHelpers.GenerateSomeBytes(37900452);
            var page2   = nAccess.Store(-1, buffer2);

            Assert.True(buffer.SequenceEqual(nAccess.Load(page1)));
            Assert.True(buffer2.SequenceEqual(nAccess.Load(page2)));

            buffer = DataHelpers.GenerateSomeBytes(678000023);
            page1  = nAccess.Store(page1, buffer);
            Assert.True(buffer.SequenceEqual(nAccess.Load(page1)));

            Assert.True(File.Exists(filename + ".data"));
            Assert.True(File.Exists(filename + ".index"));
        }
Exemplo n.º 2
0
        public void RTreeCustomShapesCanBeRecycled()
        {
            var  filename = Path.GetTempFileName();
            long indexId  = 0;

            // create the new storage manager
            using (var storageManager = new DiskStorageManager(filename))
            {
                var options = new RTreeOptions()
                {
                    Dimensions      = 2,
                    EnsureTightMBRs = true,
                    TreeVariant     = RTreeVariant.RStar,
                    FillFactor      = 0.9
                };

                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = true;
                storageManager.PageSize        = 1024;

                using (var rtree = new RTree <byte[]>(options, storageManager))
                {
                    rtree.Add(new Circle(new Point(0, 0), 16), DataHelpers.GenerateSomeBytes(0x123021));

                    // verify that our circle is a circle
                    var circle = rtree.IntersectsWith(new Point(0, 0));
                    Assert.Equal(1, circle.Count());
                    Assert.Equal(0, rtree.IntersectsWith(new Point(15.99, 15.99)).Count());
                    indexId = rtree.Options.IndexIdentifier;
                }
            }

            // recycle the storage manager
            using (var storageManager = new DiskStorageManager(filename))
            {
                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = false;
                storageManager.PageSize        = 1024;

                var options = new RTreeOptions(indexId)
                {
                    Dimensions      = 2,
                    EnsureTightMBRs = true,
                    TreeVariant     = RTreeVariant.RStar,
                    FillFactor      = 0.9
                };

                using (var rtree = new RTree <byte[]>(options, storageManager))
                {
                    // verify that our circle is a circle
                    Assert.Equal(1, rtree.IntersectsWith(new Point(0, 0)).Count());
                    Assert.Equal(0, rtree.IntersectsWith(new Point(15.5, 15.5)).Count());
                }
            }
        }
Exemplo n.º 3
0
        public void DiskStorageManager_ItStillWorksWithDefaults()
        {
            var filename       = Path.GetTempFileName();
            var storageManager = new DiskStorageManager(filename);

            // a random but repeatable seed
            var buffer  = DataHelpers.GenerateSomeBytes(10927424);
            var nAccess = new StorageManagerAccess(storageManager);
            var page1   = nAccess.Store(-1, buffer);

            var buffer2 = DataHelpers.GenerateSomeBytes(48202378);
            var page2   = nAccess.Store(-1, buffer2);

            Assert.True(buffer.SequenceEqual(nAccess.Load(page1)));
            Assert.True(buffer2.SequenceEqual(nAccess.Load(page2)));

            buffer = DataHelpers.GenerateSomeBytes(1234134);
            page1  = nAccess.Store(page1, buffer);
            Assert.True(buffer.SequenceEqual(nAccess.Load(page1)));

            Assert.True(File.Exists(filename + "." + storageManager.DatafileSuffix));
            Assert.True(File.Exists(filename + "." + storageManager.IndexfileSuffix));
        }
Exemplo n.º 4
0
        public void DoABunchOfStuffFromDisk()
        {
            var  filename = Path.GetTempFileName();
            long indexId  = 0;

            // create the new storage manager
            using (var storageManager = new DiskStorageManager(filename))
            {
                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = true;
                storageManager.PageSize        = 1024;

                using (var rtree = GetAFullTree(storageManager))
                {
                    Assert.Equal(10000, rtree.Count);

                    indexId = rtree.Options.IndexIdentifier;
                }
            }

            var stopWatch = new Stopwatch();

            // recycle the storage manager
            using (var storageManager = new DiskStorageManager(filename))
            {
                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = false;
                storageManager.PageSize        = 1024;

                var options = new RTreeOptions(indexId)
                {
                    Dimensions               = 2,
                    EnsureTightMBRs          = false,
                    TreeVariant              = RTreeVariant.RStar,
                    FillFactor               = 0.9,
                    IndexCapacity            = 10000,
                    SplitDistributionFactor  = 0.5,
                    NearMinimumOverlapFactor = 2
                };

                var rand = new Random();
                using (var rtree = new RTree <byte[]>(options, storageManager))
                {
                    Assert.Equal(10000, rtree.Count);

                    stopWatch.Start();

                    long totalMatch = 0;
                    for (int i = 0; i < 10000; ++i)
                    {
                        var count = CountAnIntersection(rtree, rand);
                        Assert.True(count < 10000);
                        totalMatch += count;
                    }
                    stopWatch.Stop();

                    PrintPerformanceReport(stopWatch.ElapsedMilliseconds, 500, totalMatch);
                }
            }
        }
Exemplo n.º 5
0
        public void RTreeCanBeRecoveredFromDisk()
        {
            var  filename = Path.GetTempFileName();
            long indexId  = 0;

            // create the new storage manager
            using (var storageManager = new DiskStorageManager(filename))
            {
                var options = new RTreeOptions()
                {
                    Dimensions      = 2,
                    EnsureTightMBRs = true,
                    TreeVariant     = RTreeVariant.RStar,
                    FillFactor      = 0.9
                };

                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = true;
                storageManager.PageSize        = 1024;

                using (var rtree = new RTree <byte[]>(options, storageManager))
                {
                    rtree.Add(new Circle(new Point(-8, 2), 4), DataHelpers.GenerateSomeBytes(0x123021));
                    rtree.Add(new Circle(new Point(0, 2), 4), DataHelpers.GenerateSomeBytes(0x723321));
                    rtree.Add(new Circle(new Point(8, 2), 4), DataHelpers.GenerateSomeBytes(0x325721));
                    rtree.Add(new Circle(new Point(-4, -4), 0), DataHelpers.GenerateSomeBytes(0x452910));
                    rtree.Add(new Circle(new Point(4, -4), 0), DataHelpers.GenerateSomeBytes(0x7290900));

                    // sanity check
                    Assert.Equal(5, rtree.Count());
                    indexId = rtree.Options.IndexIdentifier;
                }
            }

            // recycle the storage manager
            using (var storageManager = new DiskStorageManager(filename))
            {
                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = false;
                storageManager.PageSize        = 1024;

                var options = new RTreeOptions(indexId)
                {
                    Dimensions      = 2,
                    EnsureTightMBRs = true,
                    TreeVariant     = RTreeVariant.RStar,
                    FillFactor      = 0.9
                };

                using (var rtree = new RTree <byte[]>(options, storageManager))
                {
                    // make sure my objects are still there
                    Assert.Equal(5, rtree.Count());

                    // make sure they are still correct
                    var intersection = rtree.IntersectsWith(new Circle(new Point(4, -4), 4));
                    Assert.Equal(3, intersection.Count());
                }
            }
        }
Exemplo n.º 6
0
        public void DiskStorageManager_CanRestoreAndRead()
        {
            var  filename = Path.GetTempFileName();
            long page1, page2, page3, dataFileSize, indexFileSize;

            byte[] buffer, buffer2, buffer3;

            // a random but repeatable seed
            buffer = DataHelpers.GenerateSomeBytes(165843578);
            using (var storageManager = new DiskStorageManager(filename))
            {
                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = true;
                storageManager.PageSize        = 1024;

                using (var nAccess = new StorageManagerAccess(storageManager))
                {
                    page1 = nAccess.Store(-1, buffer);

                    buffer2 = DataHelpers.GenerateSomeBytes(46589725);
                    page2   = nAccess.Store(-1, buffer2);

                    Assert.True(buffer.SequenceEqual(nAccess.Load(page1)));
                    Assert.True(buffer2.SequenceEqual(nAccess.Load(page2)));

                    buffer = DataHelpers.GenerateSomeBytes(154967862);
                    page1  = nAccess.Store(page1, buffer);
                    Assert.True(buffer.SequenceEqual(nAccess.Load(page1)));
                }
            }

            // now that the files are closed get our fs view
            Assert.True(File.Exists(filename + ".data"));
            dataFileSize = new FileInfo(filename + ".data").Length;
            Assert.True(File.Exists(filename + ".index"));
            indexFileSize = new FileInfo(filename + ".index").Length;

            // ok now start again
            using (var storageManager = new DiskStorageManager(filename))
            {
                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = false;
                storageManager.PageSize        = 1024;

                using (var nAccess = new StorageManagerAccess(storageManager))
                {
                    buffer3 = DataHelpers.GenerateSomeBytes(659873219);
                    page3   = nAccess.Store(-1, buffer3);

                    // make sure the files have not shrunk
                    Assert.True(new FileInfo(filename + ".data").Length >= dataFileSize);
                    Assert.True(new FileInfo(filename + ".index").Length >= indexFileSize);

                    // make sure all of our pages match
                    Assert.True(buffer.SequenceEqual(nAccess.Load(page1)));
                    Assert.True(buffer2.SequenceEqual(nAccess.Load(page2)));
                    Assert.True(buffer3.SequenceEqual(nAccess.Load(page3)));
                }
            }
        }