Index: src/java/org/apache/lucene/index/IndexWriter.java
===================================================================
--- src/java/org/apache/lucene/index/IndexWriter.java	(revision 473172)
+++ src/java/org/apache/lucene/index/IndexWriter.java	(working copy)
@@ -110,7 +110,7 @@
 
   private SegmentInfos segmentInfos = new SegmentInfos(); // the segments
   private SegmentInfos ramSegmentInfos = new SegmentInfos(); // the segments in ramDirectory
-  private final Directory ramDirectory = new RAMDirectory(); // for temp segs
+  private final RAMDirectory ramDirectory = new RAMDirectory(); // for temp segs
 
   private Lock writeLock;
 
@@ -856,14 +856,28 @@
     }
   }
 
-  /** Merges all RAM-resident segments, then may merge segments. */
-  private final void flushRamSegments() throws IOException {
+  /** Expert:  Merges all RAM-resident segments, then may merge segments. */
+  public final synchronized void flushRamSegments() throws IOException {
     if (ramSegmentInfos.size() > 0) {
       mergeSegments(ramSegmentInfos, 0, ramSegmentInfos.size());
       maybeMergeSegments(minMergeDocs);
     }
   }
 
+  /** Expert:  Return the total size of all index files currently cached in memory.
+   * Useful for size management with flushRamDocs()
+   */
+  public final long ramSizeInBytes() {
+    return ramDirectory.sizeInBytes();
+  }
+
+  /** Expert:  Return the number of documents whose segments are currently cached in memory.
+   * Useful when calling flushRamSegments()
+   */
+  public final synchronized int numRamDocs() {
+    return ramSegmentInfos.size();
+  }
+  
   /** Incremental segment merger.  */
   private final void maybeMergeSegments(int startUpperBound) throws IOException {
     long lowerBound = -1;
Index: src/java/org/apache/lucene/store/RAMDirectory.java
===================================================================
--- src/java/org/apache/lucene/store/RAMDirectory.java	(revision 473172)
+++ src/java/org/apache/lucene/store/RAMDirectory.java	(working copy)
@@ -22,6 +22,8 @@
 import java.io.Serializable;
 import java.util.Hashtable;
 import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Collection;
 
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IndexInput;
@@ -39,6 +41,7 @@
   private static final long serialVersionUID = 1l;
 
   Hashtable files = new Hashtable();
+  Collection fileValues = files.values();
 
   /** Constructs an empty {@link Directory}. */
   public RAMDirectory() {
@@ -153,6 +156,17 @@
     RAMFile file = (RAMFile)files.get(name);
     return file.length;
   }
+  
+  /** Return total size in bytes of all files in this directory */
+  public final long sizeInBytes() {
+    long size = 0;
+    synchronized (files) {
+      Iterator it = fileValues.iterator();
+      while (it.hasNext())
+        size += ((RAMFile) it.next()).length;
+    }
+    return size;
+  }
 
   /** Removes an existing file in the directory. */
   public final void deleteFile(String name) {
