add buffering to the map

This commit is contained in:
2021-11-04 18:51:47 +01:00
parent 51d1df0657
commit f3428b5bca
2 changed files with 42 additions and 3 deletions

View File

@@ -16,6 +16,7 @@ class Int2IntMapLike():
def __init__(self, file):
self._file = file
self._handle = open(file, "w+t")
self._buffer = ""
def close(self):
if not self._handle.closed:
@@ -27,13 +28,22 @@ class Int2IntMapLike():
def add(self, start: int, length: int, val: int):
line = "%d,%d,%d\n" % (start, length, val)
length = len(line)
offset = self._handle.tell()
offset = self._handle.tell() + len(self._buffer)
if offset % self.blocksize + length > self.blocksize:
# end of block: fill block
fill_bytes = self.blocksize - offset % self.blocksize
self._handle.write("\n" * fill_bytes)
self._handle.write(line)
self._buffer = self._buffer + ("\n" * fill_bytes)
else:
self._buffer = self._buffer + line
def _flush_buffer(self):
self._handle.write(self._buffer)
self._buffer = ""
self._handle.flush()
def find(self, key: int) -> Optional[int]:
if (len(self._buffer)) > 0:
self._flush_buffer()
size = os.stat(self._file).st_size
if size == 0:
return None

View File

@@ -16,6 +16,35 @@ class Int2IntMapLikeTest(unittest.TestCase):
self.map.close()
self.test_dir.cleanup()
def test_empty_map(self):
map = self.map
self.assertEqual(None, map.find(0))
def test_one_line_one_byte(self):
map = self.map
map.add(10, 1, 1) # add only the key 10
self.assertEqual(None, map.find(9)) # directly before
self.assertEqual(1, map.find(10))
self.assertEqual(None, map.find(11)) # directly after
def test_one_line_two_bytes(self):
map = self.map
map.add(10, 2, 1) # added keys 10 and 11
self.assertEqual(None, map.find(9)) # directly before
self.assertEqual(1, map.find(10))
self.assertEqual(1, map.find(11))
self.assertEqual(None, map.find(12)) # directly after
def test_two_lines(self):
map = self.map
map.add(10, 1, 1) # added key 10
map.add(12, 1, 2) # added key 12
self.assertEqual(None, map.find(9)) # directly before
self.assertEqual(1, map.find(10))
self.assertEqual(None, map.find(11)) # between
self.assertEqual(2, map.find(12))
self.assertEqual(None, map.find(13)) # directly after
def test_fill_map(self):
map = self.map
map.blocksize = 64