/**
  * Load an out-of-core partition in memory.
  *
  * @param partitionId Partition id
  */
 private void loadPartition(Integer partitionId) {
   if (loadedPartition != null) {
     if (loadedPartition.getId() == partitionId) {
       return;
     }
     if (LOG.isInfoEnabled()) {
       LOG.info("loadPartition: moving partition " + loadedPartition.getId() + " out of core");
     }
     try {
       writePartition(loadedPartition);
       onDiskPartitions.put(loadedPartition.getId(), loadedPartition.getVertices().size());
       loadedPartition = null;
     } catch (IOException e) {
       throw new IllegalStateException(
           "loadPartition: failed writing " + "partition " + loadedPartition.getId() + " to disk",
           e);
     }
   }
   if (LOG.isInfoEnabled()) {
     LOG.info("loadPartition: loading partition " + partitionId + " in memory");
   }
   try {
     loadedPartition = readPartition(partitionId);
   } catch (IOException e) {
     throw new IllegalStateException(
         "loadPartition: failed reading " + "partition " + partitionId + " from disk");
   }
 }
 /**
  * Write a partition to disk.
  *
  * @param partition The partition object to write
  * @throws java.io.IOException
  */
 private void writePartition(Partition<I, V, E, M> partition) throws IOException {
   File file = new File(getPartitionPath(partition.getId()));
   file.getParentFile().mkdirs();
   file.createNewFile();
   DataOutputStream outputStream =
       new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
   for (Vertex<I, V, E, M> vertex : partition.getVertices()) {
     vertex.write(outputStream);
   }
   outputStream.close();
 }
  /**
   * Add a new partition without requiring a lock.
   *
   * @param partition Partition to be added
   */
  private void addPartitionNoLock(Partition<I, V, E, M> partition) {
    synchronized (inMemoryPartitions) {
      if (inMemoryPartitions.size() + 1 < maxInMemoryPartitions) {
        inMemoryPartitions.put(partition.getId(), partition);

        return;
      }
    }
    try {
      writePartition(partition);
      onDiskPartitions.put(partition.getId(), partition.getVertices().size());
    } catch (IOException e) {
      throw new IllegalStateException(
          "addPartition: failed writing " + "partition " + partition.getId() + "to disk");
    }
  }