def append(self, key, value):
        self._checkKey(key)

        pos = self._data.getLength()
        if self._size >= self._last_index_nkeys + self.INDEX_INTERVAL and pos > self._last_index_pos:
            self._index.append(key, LongWritable(pos))
            self._last_index_pos = pos
            self._last_index_nkeys = self._size

        self._data.append(key, value)
        self._size += 1
    def _readIndex(self):
        if self._keys:
            return

        key_class = self._index.getKeyClass()

        skip = self.INDEX_SKIP
        position = LongWritable()
        last_position = None
        while True:
            key = key_class()
            if not self._index.next(key, position):
                break

            if skip > 0:
                skip -= 1
                continue

            skip = self.INDEX_SKIP
            if position.get() == last_position:
                continue

            self._positions.append(position.get())
            self._keys.append(key)
 def __init__(self, path):
     super(Reader, self).__init__(path)
     self._key = LongWritable(0)
 def append(self, value):
     super(Writer, self).append(LongWritable(self._count), value)
     self._count += 1