Index: src/uk/ac/gla/terrier/compression/MemorySBOS.java
===================================================================
--- src/uk/ac/gla/terrier/compression/MemorySBOS.java	(revision 2573)
+++ src/uk/ac/gla/terrier/compression/MemorySBOS.java	(working copy)
@@ -62,5 +62,10 @@
 	 */
 	public MemoryOutputStream getMOS(){
 		return mos;
+	}
+
+	/** Return the amount of memory bytes consumed by the underlying buffer */
+	public int getSize() {
+		return mos.getSize();
 	}	
-}
\ No newline at end of file
+}
Index: src/uk/ac/gla/terrier/compression/MemoryOutputStream.java
===================================================================
--- src/uk/ac/gla/terrier/compression/MemoryOutputStream.java	(revision 2573)
+++ src/uk/ac/gla/terrier/compression/MemoryOutputStream.java	(working copy)
@@ -152,6 +152,11 @@
 		pos += length;
 		avail -= length;		
 	}
+
+	/** Get size */
+	public int getSize() {
+		return buffer.length;
+	}
 	
 	/**
 	 * @return the underlying byte[] buffer
Index: src/uk/ac/gla/terrier/structures/indexing/singlepass/MemoryPostings.java
===================================================================
--- src/uk/ac/gla/terrier/structures/indexing/singlepass/MemoryPostings.java	(revision 2573)
+++ src/uk/ac/gla/terrier/structures/indexing/singlepass/MemoryPostings.java	(working copy)
@@ -117,6 +117,17 @@
 	public int getSize(){
 		return postings.size();
 	}
+
+	/** Returns the number of bytes consumed by this set of postings */
+	public long getMemoryConsumption()
+	{
+		long size = 0;
+		for(Posting p : postings.values())
+		{
+			size += (long) p.getSize();
+		}
+		return size;
+	}
 	
 	/** Returns the number of pointers in this posting list. Pointers
 	 * are unique (term,docid) tuples.
Index: src/uk/ac/gla/terrier/structures/indexing/singlepass/Posting.java
===================================================================
--- src/uk/ac/gla/terrier/structures/indexing/singlepass/Posting.java	(revision 2573)
+++ src/uk/ac/gla/terrier/structures/indexing/singlepass/Posting.java	(working copy)
@@ -123,5 +123,10 @@
 	 */
 	public void setDocF(int docF) {
 		this.Nt = docF;
-	}	
+	}
+
+	/** Returns the size of the underlying buffer representing this posting set. */
+	public int getSize() {
+		return docIds.getSize();
+	}
 }
Index: src/uk/ac/gla/terrier/indexing/BasicSinglePassIndexer.java
===================================================================
--- src/uk/ac/gla/terrier/indexing/BasicSinglePassIndexer.java	(revision 2573)
+++ src/uk/ac/gla/terrier/indexing/BasicSinglePassIndexer.java	(working copy)
@@ -76,6 +76,7 @@
 	/** Current document Id */
 	protected int currentId = 0;
 	
+	protected long maxMemory = 0;
 	
 	/** Memory Checker - provides the method for checking to see if
 	 * the system is running low on memory */
@@ -158,6 +159,7 @@
 		currentIndex = Index.createNewIndex(path, prefix);
 		docIndexBuilder = new DocumentIndexBuilder(currentIndex);
 		MAX_DOCS_PER_BUILDER = Integer.parseInt(ApplicationSetup.getProperty("indexing.max.docs.per.builder", "0"));
+		maxMemory = Long.parseLong(ApplicationSetup.getProperty("indexing.singlepass.max.postings.memory", "0"));
 		final boolean boundaryDocsEnabled = BUILDER_BOUNDARY_DOCUMENTS.size() > 0;
 		final int collections_length = collections.length;
 		boolean stopIndexing = false;
@@ -262,7 +264,7 @@
 		if (termsInDocument.getDocumentLength() > 0) {
 			numberOfDocsSinceCheck++; numberOfDocsSinceFlush++;
 			if(docsPerCheck == numberOfDocsSinceCheck){
-				if (memoryCheck.checkMemory())
+				if ((maxMemory > 0 && mp.getMemoryConsumption() > maxMemory) || memoryCheck.checkMemory())
 				{
 					try {
 						mp.finish(finishMemoryPosting());
Index: src/uk/ac/gla/terrier/indexing/hadoop/Hadoop_BasicSinglePassIndexer.java
===================================================================
--- src/uk/ac/gla/terrier/indexing/hadoop/Hadoop_BasicSinglePassIndexer.java	(revision 2573)
+++ src/uk/ac/gla/terrier/indexing/hadoop/Hadoop_BasicSinglePassIndexer.java	(working copy)
@@ -190,6 +190,7 @@
 		Path indexDestination = FileOutputFormat.getWorkOutputPath(jc);
 		mapTaskID = TaskAttemptID.forName(jc.get("mapred.task.id")).getTaskID().toString();
 		currentIndex = Index.createNewIndex(indexDestination.toString(), mapTaskID);
+		maxMemory = Long.parseLong(ApplicationSetup.getProperty("indexing.singlepass.max.postings.memory", "0"));
 		RunData = new DataOutputStream(
 				Files.writeFileStream(
 						new Path(indexDestination, mapTaskID+".runs").toString())
@@ -274,7 +275,7 @@
 		numberOfDocsSinceCheck++; numberOfDocsSinceFlush++;
 		if(docsPerCheck == numberOfDocsSinceCheck)
 		{
-			if (memoryCheck.checkMemory())
+			if ((maxMemory > 0 && mp.getMemoryConsumption() > maxMemory) || memoryCheck.checkMemory())
 			{
 				logger.info("Memory running low, flush requested");
 				forceFlush();
@@ -491,7 +492,7 @@
 		    while (docidInput.readNextEntry() >= 0)
 			{
 				docCount++;
-				System.err.println("docid="+docCount + " docno="+ docidInput.getDocumentNumber() + " doclength="+ docidInput.getDocumentLength());
+				//System.err.println("docid="+docCount + " docno="+ docidInput.getDocumentNumber() + " doclength="+ docidInput.getDocumentLength());
 		        docidOutput.addEntryToBuffer(
 		            docidInput.getDocumentNumber(),
 		            docidInput.getDocumentLength(),

