コード例 #1
0
        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();
        }