僕はプログラミング歴2週間の初心者です。キーと値を入力できるデータベースを作っています。
以下のコードを実行してデータを追加し続けると、一定のサイズを超えるとエラーが出てしまうみたいです。
理想は、データが追加された後にサイズが足りなくなったら動的に自動拡大されることです。
もし詳しい人がいたらご教示お願い致します。
import sysimportosimportmmapimport hashlibdef h(x): return int(hashlib.sha512(x.encode()).hexdigest(), 16)def create_db(filename): withopen(filename, 'wb')as f: f.write(b'\0' * 1024 * 1024) # 1MBの空ファイルを作成defset_key(filename,key,value): withopen(filename, 'r+b')as f:mm =mmap.mmap(f.fileno(), 0)pos = h(key) %mm.size() whilemm[pos:pos+1] != b'\0':pos = (pos + 1) %mm.size() ifpos == h(key) %mm.size():f.seek(0,os.SEEK_END) f.write(b'\0' *mm.size()) #ファイルサイズを2倍にするmm =mmap.mmap(f.fileno(), f.tell()) #ファイルサイズを反映させるpos = h(key) %mm.size() #ハッシュ値を再計算する data =key + '\0' +value + '\0' data = data.encode()mm[pos:pos+len(data)] = datamm.close() #mmapオブジェクトを閉じるdefget_key(filename,key): withopen(filename, 'r+b')as f:mm =mmap.mmap(f.fileno(), 0)pos = h(key) %mm.size() whilemm[pos:pos+1] != b'\0': end =mm.find(b'\0',pos,mm.size()) # 第2引数と第3引数を指定する if end == -1: end =mm.size() ifmm[pos:end].decode() ==key:pos = end + 1 end =mm.find(b'\0',pos,mm.size()) # 第2引数と第3引数を指定する if end == -1: end =mm.size()value =mm[pos:end].decode()mm.close() #mmapオブジェクトを閉じる returnvaluepos = (pos + 1) %mm.size() ifpos == h(key) %mm.size(): breakmm.close() #mmapオブジェクトを閉じる return Nonedefmain(): cmd = sys.argv[1] if cmd == 'create': create_db(sys.argv[2]) elif cmd == 'set':set_key(sys.argv[2], sys.argv[3], sys.argv[4]) elif cmd == 'get':print(get_key(sys.argv[2], sys.argv[3]))if __name__ == '__main__':main()