Короче говоря, нет, вы не можете, за исключением случаев, когда у вас всегда есть похожие файлы для сбора статических данных перед началом оценки.
Поскольку строки тегов, атрибутов, префиксов и пространств имен интернированы, это в значительной степени зависит отструктура файла XML, насколько эффективным может быть хранилище, и соотношение по сравнению с файлом на диске также зависит от используемой кодировки.
В общем случае .NET сохраняет в памяти любую строку как UTF16.Следовательно, даже если бы не было значительных структурных накладных расходов (представьте, что XML-файл содержит только один корневой тег и много простого текста), используемая память все равно удвоится для исходного файла UTF8 (или также ASCII или любого другого 8-).битовое кодирование) используется.Таким образом, строковое кодирование является первой частью уравнения.
Другое дело, что структура данных встроена в память, чтобы обеспечить эффективный обход документа.Как правило, узлы строятся и связаны вместе со ссылками.Поэтому каждый узел занимает определенное количество памяти;Поскольку большинство данных, не являющихся значениями, являются ссылками, используемая здесь память также сильно зависит от архитектуры (64-разрядная система использует вдвое больше памяти для одной ссылки, чем 32-разрядная система).Поэтому, если у вас очень сложный документ с небольшим объемом данных (например, целая куча нескольких разных тегов с небольшим количеством текста или значений атрибутов), использование памяти будет намного выше, чем исходный размер документа, и это также будет сильно зависеть отАрхитектура, на которой работает ваше приложение.
Если у вас есть файл с несколькими очень длинными именами тегов и атрибутов и, возможно, интенсивным использованием пространства имен по умолчанию, используемая память также может быть намного меньше, чем файл на диске.
Таким образом, при условии произвольного XML-файла с неизвестной кодировкой, разумным объемом данных и сложностью будет очень трудно получить достоверную оценку.Однако, если ваши XML-файлы всегда совпадают в упомянутых пунктах, вы можете создать некоторую статистику, чтобы получить коэффициент, который дает соотношение, подходящее для вашей конкретной платформы.
Однако обратите внимание, что, глядя на «свободную память»в диспетчере задач или разговорах об «очень низком уровне памяти» идут очень смутные количественные оценки.Виртуальная память, кэши, фоновые приложения и сервисы и т. Д. Будут влиять на эффективную доступность сырой памяти.Поэтому .NET Framework не может надежно угадать, сколько памяти должно быть разрешено использовать для сохранения производительности для одного процесса или даже до безопасного выброса OutOfMemoryException.Поэтому, если вы получаете одно из этих исключений, вы обычно выходите за пределы возможной точки восстановления для своего приложения, и вам не следует пытаться перехватить и обработать эти исключения.