diff --git a/Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/MDHistoWorkspace.h b/Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/MDHistoWorkspace.h
index 845168f290714b083a0cdade2ea69e31c4afaf01..7c726cb7b054d9a905df82ebd224f036f6a8ded1 100644
--- a/Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/MDHistoWorkspace.h
+++ b/Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/MDHistoWorkspace.h
@@ -398,6 +398,8 @@ namespace MDEvents
     uint64_t sumNContribEvents()const;
     void updateSum(){m_nEventsContributed = sumNContribEvents();}
 
+    /// Get the size of an element in the HistoWorkspace.
+    static size_t sizeOfElement();
   private:
 
     void initVertexesArray();
diff --git a/Code/Mantid/Framework/MDEvents/src/MDHistoWorkspace.cpp b/Code/Mantid/Framework/MDEvents/src/MDHistoWorkspace.cpp
index 306c957772af84b207db808c075db3ea214c8f8e..8fe513c57d6cf62e49ac856032027c1f84709aab 100644
--- a/Code/Mantid/Framework/MDEvents/src/MDHistoWorkspace.cpp
+++ b/Code/Mantid/Framework/MDEvents/src/MDHistoWorkspace.cpp
@@ -434,7 +434,7 @@ namespace MDEvents
   /** Return the memory used, in bytes */
   size_t MDHistoWorkspace::getMemorySize() const
   {
-    return m_length * 2 * sizeof(signal_t);
+    return m_length * ( sizeOfElement() );
   }
 
   //----------------------------------------------------------------------------------------------
@@ -1299,6 +1299,15 @@ namespace MDEvents
     return result;
   }
 
+  /**
+   * Static helper method.
+   * @return The size of an element in the MDEventWorkspace.
+   */
+  size_t MDHistoWorkspace::sizeOfElement()
+  {
+    return (3 * sizeof(signal_t) ) + sizeof(bool);
+  }
+
 } // namespace Mantid
 } // namespace MDEvents
 
diff --git a/Code/Mantid/Framework/MDEvents/test/MDHistoWorkspaceTest.h b/Code/Mantid/Framework/MDEvents/test/MDHistoWorkspaceTest.h
index 1c2352f8bb764bc959acd0732c53114be8903866..7b4b0a1d6bf0b3a25710a74ac5f71734ee991d24 100644
--- a/Code/Mantid/Framework/MDEvents/test/MDHistoWorkspaceTest.h
+++ b/Code/Mantid/Framework/MDEvents/test/MDHistoWorkspaceTest.h
@@ -44,6 +44,11 @@ private:
     }
     return numberMasked;
   }
+  /// Helper method returns the size of an element in the MDHistoWorkspace
+  size_t sizeOfElement()
+  {
+    return (sizeof(double)*3 + sizeof(bool));
+  }
 public:
   // This pair of boilerplate methods prevent the suite being created statically
   // This means the constructor isn't called when running other tests
@@ -85,7 +90,7 @@ public:
 
     TS_ASSERT_EQUALS( ws.getNumDims(), 4);
     TS_ASSERT_EQUALS( ws.getNPoints(), 5*5*5*5);
-    TS_ASSERT_EQUALS( ws.getMemorySize(), 5*5*5*5 * sizeof(double)*2);
+    TS_ASSERT_EQUALS( ws.getMemorySize(), 5*5*5*5 * sizeOfElement());
     TS_ASSERT_EQUALS( ws.getXDimension(), dimX);
     TS_ASSERT_EQUALS( ws.getYDimension(), dimY);
     TS_ASSERT_EQUALS( ws.getZDimension(), dimZ);
@@ -152,7 +157,7 @@ public:
 
     TS_ASSERT_EQUALS( ws.getNumDims(), 2);
     TS_ASSERT_EQUALS( ws.getNPoints(), 5*5);
-    TS_ASSERT_EQUALS( ws.getMemorySize(), 5*5 * sizeof(double)*2);
+    TS_ASSERT_EQUALS( ws.getMemorySize(), 5*5 * sizeOfElement());
     TS_ASSERT_EQUALS( ws.getXDimension(), dimX);
     TS_ASSERT_EQUALS( ws.getYDimension(), dimY);
     TS_ASSERT_THROWS_ANYTHING( ws.getZDimension());
@@ -184,7 +189,7 @@ public:
 
     TS_ASSERT_EQUALS( ws.getNumDims(), 7);
     TS_ASSERT_EQUALS( ws.getNPoints(), 3*3*3*3*3*3*3);
-    TS_ASSERT_EQUALS( ws.getMemorySize(), ws.getNPoints() * sizeof(double)*2);
+    TS_ASSERT_EQUALS( ws.getMemorySize(), ws.getNPoints() * sizeOfElement());
 
     // Setting and getting
     ws.setSignalAt(5,2.3456);
@@ -311,7 +316,7 @@ public:
 
     TS_ASSERT_EQUALS( ws.getNumDims(), 4);
     TS_ASSERT_EQUALS( ws.getNPoints(), 5*10*20*10);
-    TS_ASSERT_EQUALS( ws.getMemorySize(), 5*10*20*10 * sizeof(double)*2);
+    TS_ASSERT_EQUALS( ws.getMemorySize(), 5*10*20*10 * sizeOfElement());
 
     // Setting and getting
     size_t index = 5*10*20*10-1; // The last point
diff --git a/Code/Mantid/Vates/VatesAPI/src/LoadVTK.cpp b/Code/Mantid/Vates/VatesAPI/src/LoadVTK.cpp
index 6715e5ad5865d7ef826208844406c35d3e069880..856557a2ac3eab868c63b99420727ebadbafd252 100644
--- a/Code/Mantid/Vates/VatesAPI/src/LoadVTK.cpp
+++ b/Code/Mantid/Vates/VatesAPI/src/LoadVTK.cpp
@@ -11,6 +11,7 @@
 #include <vtkUnsignedCharArray.h>
 #include <vtkUnsignedShortArray.h>
 #include "MantidKernel/MultiThreaded.h"
+#include "MantidKernel/Memory.h"
 
 using namespace Mantid::Kernel;
 using namespace Mantid::API;
@@ -99,6 +100,18 @@ namespace Mantid
         throw std::invalid_argument("Error squared array: " + errorSQArrayName + " does not exist");
       }
 
+      MemoryStats memoryStats;
+      const size_t freeMemory = memoryStats.availMem(); // in kB
+      const size_t memoryCost = MDHistoWorkspace::sizeOfElement() * output->GetNumberOfPoints() / 1000 ; // in kB
+      if(memoryCost > freeMemory)
+      {
+        std::string basicMessage = "Loading this file requires more free memory than you have available.";
+        std::stringstream sstream;
+        sstream << basicMessage << " Requires " <<  memoryCost << " KB of contiguous memory.";
+        g_log.notice(sstream.str());
+        throw std::runtime_error(basicMessage);
+      }
+
       this->setProperty("OutputWorkspace", outputWS);
 
       double* destinationSignals = outputWS->getSignalArray();