add buffering to the map
This commit is contained in:
@@ -16,6 +16,7 @@ class Int2IntMapLike():
|
|||||||
def __init__(self, file):
|
def __init__(self, file):
|
||||||
self._file = file
|
self._file = file
|
||||||
self._handle = open(file, "w+t")
|
self._handle = open(file, "w+t")
|
||||||
|
self._buffer = ""
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if not self._handle.closed:
|
if not self._handle.closed:
|
||||||
@@ -27,13 +28,22 @@ class Int2IntMapLike():
|
|||||||
def add(self, start: int, length: int, val: int):
|
def add(self, start: int, length: int, val: int):
|
||||||
line = "%d,%d,%d\n" % (start, length, val)
|
line = "%d,%d,%d\n" % (start, length, val)
|
||||||
length = len(line)
|
length = len(line)
|
||||||
offset = self._handle.tell()
|
offset = self._handle.tell() + len(self._buffer)
|
||||||
if offset % self.blocksize + length > self.blocksize:
|
if offset % self.blocksize + length > self.blocksize:
|
||||||
|
# end of block: fill block
|
||||||
fill_bytes = self.blocksize - offset % self.blocksize
|
fill_bytes = self.blocksize - offset % self.blocksize
|
||||||
self._handle.write("\n" * fill_bytes)
|
self._buffer = self._buffer + ("\n" * fill_bytes)
|
||||||
self._handle.write(line)
|
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]:
|
def find(self, key: int) -> Optional[int]:
|
||||||
|
if (len(self._buffer)) > 0:
|
||||||
|
self._flush_buffer()
|
||||||
size = os.stat(self._file).st_size
|
size = os.stat(self._file).st_size
|
||||||
if size == 0:
|
if size == 0:
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -16,6 +16,35 @@ class Int2IntMapLikeTest(unittest.TestCase):
|
|||||||
self.map.close()
|
self.map.close()
|
||||||
self.test_dir.cleanup()
|
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):
|
def test_fill_map(self):
|
||||||
map = self.map
|
map = self.map
|
||||||
map.blocksize = 64
|
map.blocksize = 64
|
||||||
|
|||||||
Reference in New Issue
Block a user