Exemplo n.º 1
0
        public async Task WriteAndReadFile()
        {
            using var allocator = new NativeAllocator64(4096 * 10_000, 25);
            var memoryTable = new SkipList64(allocator);

            var loadedWords = CommonData.Words;

            foreach (var word in loadedWords)
            {
                if (string.IsNullOrEmpty(word))
                {
                    continue;
                }
                var utf8  = Encoding.UTF8.GetBytes(word);
                var value = Encoding.UTF8.GetBytes($"VALUE={word}");
                memoryTable.Put(utf8, value);
            }

            var tempPath = System.IO.Path.GetTempPath();
            var fileName = System.IO.Path.Combine(tempPath, "Level1_1.trim");

            System.IO.File.Delete(fileName);

            var fw = new TableFileWriter(fileName);
            await fw.SaveMemoryTable(memoryTable);

            using (var blockCache = new MMapBlockCache())
            {
                var loadedTable = new TableFile(fileName, blockCache);
                await loadedTable.LoadAsync();

                // Check we can get the values back out

                var hash = new MurmurHash3();
                foreach (var word in loadedWords)
                {
                    var utf8  = Encoding.UTF8.GetBytes(word);
                    var value = Encoding.UTF8.GetBytes($"VALUE={word}");
                    var h     = hash.ComputeHash64(utf8);

                    var result = await loadedTable.GetAsync(utf8, h);

                    Assert.Equal(SearchResult.Found, result.Result);
                    Assert.Equal(value, result.Value.ToArray());
                }
            }
            System.IO.File.Delete(fileName);
        }
Exemplo n.º 2
0
        public async Task CheckTableIteratorWorks()
        {
            using var allocator = new NativeAllocator32(4096 * 10_000, 25);
            var memoryTable = new SkipList32(allocator);

            var loadedWords = CommonData.Words;

            foreach (var word in loadedWords)
            {
                if (string.IsNullOrEmpty(word))
                {
                    continue;
                }
                var utf8  = Encoding.UTF8.GetBytes(word);
                var value = Encoding.UTF8.GetBytes($"VALUE={word}");
                memoryTable.Put(utf8, value);
            }

            var tempPath = System.IO.Path.GetTempPath();
            var fileName = System.IO.Path.Combine(tempPath, "Level2_2.trim");

            System.IO.File.Delete(fileName);

            var fw = new TableFileWriter(fileName);
            await fw.SaveMemoryTable(memoryTable);

            using (var blockCache = new MMapBlockCache())
            {
                var loadedTable = new TableFile(fileName, blockCache);
                await loadedTable.LoadAsync();

                var count = 0;
                await foreach (var item in loadedTable)
                {
                    count++;
                    var key   = Encoding.UTF8.GetString(item.Key);
                    var value = Encoding.UTF8.GetString(item.Value);

                    Assert.Equal($"VALUE={key}", value);
                }
                Assert.Equal(CommonData.Words.Length, count);
            }
            System.IO.File.Delete(fileName);
        }
Exemplo n.º 3
0
        public async Task TestSkipListOverflow()
        {
            var loadedWords = CommonData.Words;
            var folder      = "D:\\Database";

            foreach (var f in System.IO.Directory.GetFiles(folder))
            {
                System.IO.File.Delete(f);
            }

            using var blocks = new MMapBlockCache();
            var dbOptions = new TrimDatabaseOptions()
            {
                DatabaseFolder = folder
            };
            var db = new TrimDatabase(dbOptions);

            await db.LoadAsync();

            foreach (var word in loadedWords)
            {
                var utf8  = Encoding.UTF8.GetBytes(word);
                var value = Encoding.UTF8.GetBytes($"VALUE={word}");
                await db.PutAsync(utf8, value);
            }

            var key           = Encoding.UTF8.GetBytes(loadedWords[0]);
            var expectedValue = Encoding.UTF8.GetBytes($"VALUE={loadedWords[0]}");

            var result = await db.GetAsync(key);

            Assert.Equal(expectedValue.ToArray(), result.ToArray());

            key           = Encoding.UTF8.GetBytes(loadedWords[loadedWords.Length / 2]);
            expectedValue = Encoding.UTF8.GetBytes($"VALUE={loadedWords[loadedWords.Length / 2]}");
            result        = await db.GetAsync(key);

            Assert.Equal(expectedValue.ToArray(), result.ToArray());

            key           = Encoding.UTF8.GetBytes(loadedWords[^ 1]);