Работа с огромными табличными документами MXL, размер которых достигает десятков гигабайт, часто заводит стандартные инструменты платформы 1С в тупик. Основная причина заключается в том, что при открытии такого файла средствами платформы система пытается десериализовать всю структуру документа и разместить её в оперативной памяти в виде объектной модели. Для файла весом 85 ГБ требуется кратно больше ресурсов, что приводит к ошибкам нехватки памяти даже на мощных серверах. В этом материале мы разберем, как подойти к решению данной задачи, перейдя от попыток «открыть файл целиком» к методам потоковой обработки данных.
Когда вы пытаетесь открыть MXL файл, платформа 1С выполняет следующие действия:
MXL — это сжатый XML).ТабличныйДокумент.Для файлов размером 85 ГБ этот процесс требует колоссального объема RAM, превышающего доступные 128 ГБ. Чтобы избежать этого, нам нужно изменить сам подход к задаче.
Вместо использования стандартного объекта ТабличныйДокумент, мы можем воспользоваться возможностями работы с файловыми потоками. Вместо того чтобы «скармливать» файл платформе целиком, мы будем считывать его частями.
Рассмотрим использование ФайловыйПоток при чтении данных. Это позволяет ограничить размер буфера и не загружать весь файл в память одновременно. Для реализации можно воспользоваться следующим подходом:
// Пример схематичного использования потокового чтения
ФайлПоток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.Открыть, РежимДоступаКФайлу.Чтение);
// Здесь реализовывается логика построчного разбора,
// которая считывает данные блоками (буферами)
// и записывает их в итоговый текстовый файл через ЗаписьТекста
Важно помнить, что структура MXL — это упорядоченный XML. Если вы знаете структуру секций, вы можете использовать SAX-парсер, который считывает узлы последовательно, практически не потребляя оперативной памяти.
Если ваша задача — выгрузка журнала регистрации (что является классическим сценарием для таких огромных файлов), то работа с MXL является промежуточным, избыточным звеном. Сохранение в MXL само по себе потребляет ресурсы. Рассмотрим более правильный путь:
ЗаписьТекста, который записывает данные в целевой файл последовательно.Пример работы с ЗаписьТекста:
Запись = Новый ЗаписьТекста(ИмяВыходногоФайла, КодировкаТекста.UTF8);
// Цикл по данным журнала
Для Каждого ЗаписьЖурнала Из ДанныеЖурнала Цикл
СтрокаДляЗаписи = СтрШаблон("%1;%2;%3", ЗаписьЖурнала.Дата, ЗаписьЖурнала.Пользователь, ЗаписьЖурнала.Событие);
Запись.ЗаписатьСтроку(СтрокаДляЗаписи);
КонецЦикла;
Запись.Закрыть();
Если цель вашей задачи — анализ больших данных, помните, что Excel и простые текстовые файлы имеют ограничения по производительности. Для файлов объемом в десятки гигабайт рекомендуется:
Загрузка в СУБД также может производиться поэтапно (порциями), что позволяет обрабатывать файлы практически любого размера, не ограничиваясь объемом оперативной памяти вашего компьютера.
Проанализируем ситуацию: если файл уже существует в формате MXL и вам жизненно необходимо его разобрать, попробуйте изучить структуру формата MXL (как XML-архива) и используйте внешние утилиты для декомпрессии и конвертации. Однако в будущем, для таких объемов данных, мы настоятельно рекомендуем исключить этап формирования ТабличногоДокумента и сразу записывать данные в текстовый или CSV-формат в процессе формирования отчета или выгрузки журнала.
Помните: порционная обработка — это ваш главный инструмент в борьбе с нехваткой оперативной памяти при работе с Big Data в 1С.