public void Persist(MemTable memTable, int fileNumber) { var rowAt = 0; var len = (memTable.Store.Count * (64 + 64 + 64 + 1)) + memTable.TotalKeyLength; byte[] data = new byte[len]; foreach (var item in memTable.Store) { var keyBytesLength = item.Key.Length; byte[] row = new byte[64 + keyBytesLength + 64 + 64]; var keyBytes = Encoding.ASCII.GetBytes(item.Key); var keyLengthBytes = BitConverter.GetBytes((long)keyBytesLength); var positionBytes = BitConverter.GetBytes(item.Value._postion); var valueLengthBytes = BitConverter.GetBytes(item.Value._valueLen); keyLengthBytes.CopyTo(row, 0); keyBytes.CopyTo(row, 65); positionBytes.CopyTo(row, 64 + keyBytesLength + 1); valueLengthBytes.CopyTo(row, 64 + keyBytesLength + 64 + 1); row.CopyTo(data, rowAt); rowAt += row.Length + 1; } var indexFile = new FileStream(_kDB.DBPath + "/Index-" + fileNumber.ToString() + ".db", FileMode.CreateNew); indexFile.Write(data, 0, len); indexFile.Close(); }
public void Put(string key, FencePointer fencePointer) { if (_memTable.Count() >= 100000) { _memTable.Persist(++_lastIndexFileNumber); _memTable = new MemTable(_kDB); _dlinkedList.AddFirst(_memTable); } _memTable.Put(key, fencePointer); }
public IndexManager(KDB kDB) { _kDB = kDB ?? throw new ArgumentNullException(nameof(kDB)); _lastIndexFileNumber = GetLastFileNumber(); _dlinkedList = new LinkedList <IIndexTable>(); LoadSSTables(); _memTable = new MemTable(kDB); _dlinkedList.AddFirst(_memTable); }