public static void CheckMemoryPressure() { if (PersistentProgram.memLimit == 0) { return; } // Check if we're within 80% of the limit var mem = BoogieUtil.GetMemUsage(); if (mem < (0.8) * PersistentProgram.memLimit) { return; } PersistentProgram.FreeParserMemory(); GC.Collect(); if (changedSettingsForSavingMemory) { return; } changedSettingsForSavingMemory = true; // Set flags useFiles = true; useDuplicator = false; PersistentProgram.FreeParserMemory(); // Move all programs to disk programs = programs.Filter(wr => wr.IsAlive); var stat = 0; foreach (var wr in programs) { var p = wr.Target as PersistentProgramIO; if (p == null) { continue; } if (p.programStream is FileStream) { continue; } p.unresolved_program = null; p.fileName = "temp_corral_file" + count.ToString(); count++; if (p.programStream is MemoryStream) { var fs = new FileStream(p.fileName, FileMode.Create); fs.Write((p.programStream as MemoryStream).GetBuffer(), 0, (int)(p.programStream as MemoryStream).Length); p.programStream = fs; } else { Debug.Assert(p.programStream is string); System.IO.File.WriteAllText(p.fileName, (string)p.programStream); p.programStream = new FileStream(p.fileName, FileMode.Open); } stat++; } if (stat != 0) { Console.WriteLine("Moved {0} files to disk to save memory", stat); } // Force GC GC.Collect(); }