/** * 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"); } }