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")); }
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()); } } }
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)); }
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); } } }
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()); } } }
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))); } } }