Show stats around serialized variables
diff --git a/serialize.go b/serialize.go
index e217f69..827edc6 100644
--- a/serialize.go
+++ b/serialize.go
@@ -276,7 +276,101 @@
 	return r
 }
 
+func human(n int) string {
+	if n >= 10 * 1000 * 1000 * 1000 {
+		return fmt.Sprintf("%.2fGB", float32(n) / 1000 / 1000 / 1000)
+	} else if n >= 10 * 1000 * 1000 {
+		return fmt.Sprintf("%.2fMB", float32(n) / 1000 / 1000)
+	} else if n >= 10 * 1000 {
+		return fmt.Sprintf("%.2fkB", float32(n) / 1000)
+	} else {
+		return fmt.Sprintf("%dB", n)
+	}
+}
+
+func showSerializedNodesStats(nodes []*SerializableDepNode) {
+	outputSize := 0
+	cmdSize := 0
+	depsSize := 0
+	actualInputSize := 0
+	tsvSize := 0
+	filenameSize := 0
+	linenoSize := 0
+	for _, n := range nodes {
+		outputSize += len(n.Output)
+		for _, c := range n.Cmds {
+			cmdSize += len(c)
+		}
+		for _, d := range n.Deps {
+			depsSize += len(d)
+		}
+		for _, i := range n.ActualInputs {
+			actualInputSize += len(i)
+		}
+		for _ = range n.TargetSpecificVars {
+			tsvSize += 4
+		}
+		filenameSize += len(n.Filename)
+		linenoSize += 4
+	}
+	size := outputSize + cmdSize + depsSize + actualInputSize + tsvSize + filenameSize + linenoSize
+	LogStats("%d nodes %s", len(nodes), human(size))
+	LogStats(" output %s", human(outputSize))
+	LogStats(" command %s", human(cmdSize))
+	LogStats(" deps %s", human(depsSize))
+	LogStats(" inputs %s", human(actualInputSize))
+	LogStats(" tsv %s", human(tsvSize))
+	LogStats(" filename %s", human(filenameSize))
+	LogStats(" lineno %s", human(linenoSize))
+}
+
+func (v SerializableVar) size() int {
+	size := 0
+	size += len(v.Type)
+	size += len(v.V)
+	size += len(v.Origin)
+	for _, c := range v.Children {
+		size += c.size()
+	}
+	return size
+}
+
+func showSerializedVarsStats(vars map[string]SerializableVar) {
+	nameSize := 0
+	valueSize := 0
+	for k, v := range vars {
+		nameSize += len(k)
+		valueSize += v.size()
+	}
+	size := nameSize + valueSize
+	LogStats("%d vars %s", len(vars), human(size))
+	LogStats(" name %s", human(nameSize))
+	LogStats(" value %s", human(valueSize))
+}
+
+func showSerializedTsvsStats(vars []SerializableTargetSpecificVar) {
+	nameSize := 0
+	valueSize := 0
+	for _, v := range vars {
+		nameSize += len(v.Name)
+		valueSize += v.Value.size()
+	}
+	size := nameSize + valueSize
+	LogStats("%d tsvs %s", len(vars), human(size))
+	LogStats(" name %s", human(nameSize))
+	LogStats(" value %s", human(valueSize))
+}
+
+func showSerializedGraphStats(g SerializableGraph) {
+	showSerializedNodesStats(g.Nodes)
+	showSerializedVarsStats(g.Vars)
+	showSerializedTsvsStats(g.Tsvs)
+}
+
 func DeserializeGraph(g SerializableGraph) ([]*DepNode, Vars) {
+	if katiLogFlag || katiStatsFlag {
+		showSerializedGraphStats(g)
+	}
 	nodes := DeserializeNodes(g.Nodes, g.Tsvs)
 	vars := DeserializeVars(g.Vars)
 	return nodes, vars