@Override
    protected SortedSet<Long> compute() {
      SortedSet<Long> index = new TreeSet<>();
      try {
        if (length < threshold) {
          BufferedAccessFile raf = null;
          try {
            raf = new BufferedAccessFile(file, "r");
            raf.seek(start);

            // Add the position for 1st line
            if (raf.getFilePointer() == 0L) {
              index.add(raf.getFilePointer());
            }
            while (raf.getFilePointer() < end) {
              raf.getNextLine();
              index.add(raf.getFilePointer());
            }
          } finally {
            if (raf != null) {
              raf.close();
            }
          }
        } else {
          long start1 = start;
          long end1 = start + (length / 2);

          long end2 = end;

          IndexingTask task1 = new IndexingTask(file, start1, end1, threshold);
          task1.fork();
          IndexingTask task2 = new IndexingTask(file, end1, end2, threshold);

          index.addAll(task2.compute());
          index.addAll(task1.join());
        }
      } catch (IOException ex) {
        throw new FileReaderException("Error while index file:" + ex.getMessage(), ex);
      }

      return index;
    }