If the result won't all fit into core memory, you can put it in a memory-mapped array so that the overflow will be written to your hard disk:
shape = (QT.shape[2],)*2
result = np.memmap('result.dat', dtype=QT.dtype, mode='w+', shape=shape)
np.dot(QT.T, QT, out=result)
You may also want to take a look at this algorithm for performing out-of-core SVD on very large arrays.