Недостаточно памяти и как узнать сколько доступно памяти для 1С 8.2

Думаю, некоторые сталкивались с предупреждением о нехватке памяти и падением платформы при выполнении какой либо сложной/тяжелой обработки. Попытаемся выяснить, сколько же всего доступно памяти для платформы 1С.

Было у меня задание разработать парсер для сайта, что собственно мной было и сделано и сдано заказчику на тестирование. В процессе тестирования заказчик пожаловался, что уже в финале обработки платформа падает с ошибкой о «недостаточно памяти».

При разборе «полетов» я обнаружил, что ошибка сваливается при сохранении промежуточных данных в json формате, которые, в свою очередь, до сохранения в файл лежали в переменной типа «строка». Т.к. к финалу работы данных набиралось много, то происходило переполнение, казалось бы «бесконечной», строки. В итоге, чтобы определить, а сколько надо то памяти написал крохотную обработку, которая заполняла строку рандомным набором символов. Верхний предел я установил длинной примерно в 600 млн символов или, учитывая то, что строки в платформе 8.2 хранятся в utf-8, ~1.2 Гб памяти.

Результат — падение платформы на 350 млн символах.

Решение данной проблемы на просторах интернета есть, вот одно из них. Если ссылка битая, то вот, собственно, решение:

bcdedit /set increaseuserva 3000

таким образом, мы увеличили количество доступной памяти для процесса до 3 тыс Мб. Скорее всего поможет, не проверял.


Собственно код обработки

Процедура КнопкаВыполнитьНажатие(Кнопка)

генЧисел = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата()));

БольшоеСлово = "";
СчетчикСтрок = 0;
ВсегоСтрок = 0;

Для сч = 0 По 600 Цикл
СреднееСлово = "";


Для сч1 = 0 По 1024 Цикл
МалоеСлово = "";

Для сч2 = 0 По 1024 Цикл
МалоеСлово = МалоеСлово + Символ(генЧисел.СлучайноеЧисло(64,122));
КонецЦикла;

ВсегоСтрок = ВсегоСтрок + 1;
СчетчикСтрок = СчетчикСтрок + 1;
ОбработкаПрерыванияПользователя();

СреднееСлово = СреднееСлово + МалоеСлово + Символы.ПС;

Если СчетчикСтрок >= 50 Тогда
Состояние("Прошли - " + Строка(ВсегоСтрок));
НадписьПройдено = "Прошли - " + Строка(ВсегоСтрок);
СчетчикСтрок = 0;
КонецЕсли;

КонецЦикла;

БольшоеСлово = БольшоеСлово + СреднееСлово;

КонецЦикла;

КонецПроцедуры

44 Comments

  1. greenLiss

    На две недельки бы раньше… Мне из-за этой ошибки пришлось с ХР на 8 перейти ) (времени разбираться небыло)

    Но всё равно, спасибо, буду знать 🙂

    Reply
  2. cool.vlad4

    (1) greenLiss, автор статьи не сказал этого, но bcdedit какбэ намекает, что способ в статье на xp работать не будет.

    Reply
  3. greenLiss

    (2) cool.vlad4, ну значит, не зря перешел 🙂

    Reply
  4. Alex1Cnic

    А для Windows Xp нужно в boot.ini дописать параметр /3Gb:

    например

    multi(0)disk(0)rdisk(0)partition(1)WINDOWS=»Microsoft Windows XP Professional RU» /noexecute=optin /fastdetect /3Gb

    Reply
  5. Famza

    Я просто в boot.ini прописал ключ /3GB. (4) Опоздал)))

    Можно добавить еще что-нибудь, но для ХР, имхо, это максимум что можно сделать, несмотря на неплохое железо.

    Reply
  6. slavok123

    на 7-ке 32 битной аналогично было при обновлении даже, на 64-битной нет ошибки! хотя памяти одинаково было озу

    Reply
  7. Nicolas_d

    Чего я не указал в статье, так это конфиг железа и ОСи.

    Тестирование проводилось на Win 7 Pro x64 Core i5-4670/ 16Gb оперативы. Версия 1С использовалась 8.2.18.104 обычные формы. Клиент тестил на Win XP Pro 3Gb оперативы. Для него критичен запуск на XP.

    Reply
  8. xten

    А сколько в среднем по времени тест будет длиться при запуске с обычного пользовательского компа, например, core i3 4-8 ГБ ОЗУ ?

    Reply
  9. Nicolas_d

    (8) xten, у меня тест продлился примерно 30 минут, точно не засекал. Пообедал, чуть поработал, открыл — ошибка )) от ядрённости процессора не зависит, 1Ска однопоточна, зависит от частоты процессора. Мне кажется у вас будет так же, как и у меня, может чуть медленней. Я попытался и так оптимизировать рост строки по блокам, т.к. платформа в этом отношении достаточно тупая, в одном цикле при добавлении буквы за буквой примерно уже на 5Мб текста начинаются жуткие тормоза при сложении строк. Оптимально генерить блоки по мегабайту и добавлять к основной строке, собственно также и стоит организовывать чтение больших текстовых файлов, последовательно блоками.

    Reply
  10. Yashazz

    Интересно, относится ли такое ограничение к строкам, получаемым как результат штатных функций 1С? Например, вы упоминаете парсинг сайта. ЭлементыФормы.ПолеХТМЛ.ПолучитьТекст() — как себя поведёт на таких объёмах, сыпанётся?

    Reply
  11. Nicolas_d

    (10) Yashazz, Если теоретически предположить что страницы объемом более 600 Мб бывают (как в моем синтетическом случае), то, я думаю, однозначно будет падение системы. Только перед этим она будет дооолго думать))

    Reply
  12. juntatalor

    (9) Nicolas_d, была статейка про особенности конкатенации строк в 1С — смысл в том, что начиная с определенного размера «бесконечная» строка перестает хранится в памяти, и переносится во временный файл на жесткий диск, что существенно замедляет работу с ней.

    Reply
  13. insurgut

    Панацея — клиент 1С 64-разрядный под Linux 🙂

    Reply
  14. Andreynikus

    (9) Nicolas_d,

    1Ска однопоточна

    Откуда такие сведения?

    Reply
  15. Nicolas_d

    (14) Andreynikus, прям в мануал не тыкну, не видел такого, говорю о том,что вижу при загрузке процессора именно клиентом 1С:Предприятия. Явно видно, что любая обработка выполняется последовательно в один поток плюс «фризы» самой конфигурации при выполнении явно об этом говорят. Про сервер не говорю и не имею его ввиду. К сожалению, многопоточных вычислений в одной обработке выполнить пока невозможно.

    Reply
  16. cool.vlad4

    (14) Andreynikus, ну очевидно, что 1С многопоточна. хотя бы потому, что это gui-евое приложение. вероятно он имел ввиду, что из 1С кода без ВК, нет возможности управлять более чем одним потоком.

    Reply
  17. DoctorRoza

    (16) вот Вам немного информации к размышлению. Имею УПП, объем базы 350 Гб, сервер, 120 Гб оперативы. При обновлении (то есть, просто сравнить конфигурации основную и новую поставщика) с помощью компа 4 Гб оперативны , core 2duo требуется время 30 минут. На компе 24 Гб оперативны, i7, требуется 3 минуты. При переносе темповских файлов 1С в ram-диск, то есть чтобы файлы сравнения конфигурации помещались не на физический диск , а в оперативную память или работе на SSD-диске, выигрыш по времени составил около 10%. Во всех процессах, контролировал загрузку железа в штатном мониторе ресурсов. Не знаю о какой многопоточности тут говорят, но как 1ядро напрягалось, так и напрягается сейчас. Никакие апгрейды железа для 1с, кроме как процессора, ощутимого выигрыша не дают! Не думаю, что об это сама 1с напишет, это все равно, что признаться в своей ущербности!

    Reply
  18. Nicolas_d

    (17) DoctorRoza, поддерживаю

    Reply
  19. cool.vlad4

    (17) DoctorRoza, если признаетесь, что не знаете, что такое поток и многопоточность, тогда советую почитать чего-нибудь на эту тему. как вы собрались определять многопоточность по загрузке процессора — загадка, множество потоков работает в пределах одного процесса, и многопоточность запросто существует на одноядерных процессорах, (а иначе как на таких компьютерах работают другие программы?) короче советую вам обновить свои знания, ущербность 1С здесь ни при чем. забавно, что не зная такой простой вещи (это азы программирования), вы мне даете инфу для размышления )))

    Reply
  20. Nicolas_d

    Хех, наверное завершу холивар про многопоточность 1С. Давайте расставим все точки над Ё. Сама платформа (в нашем случае клиент 1С, неважно какой тонкий или толстый) многопоточна, в этом сомнений нет. Достаточно заглянуть в монитор ресурсов:



    Нет никаких сомнений, что через энное место запустить даже отдельные потоки для обработки данных (вспоминаем фоновые процессы), все работает очень даже ничего.

    Но остается непреложным факт того, о чем я и говорю изначально, штатными средствами в одной внешней обработке или отчете никак нельзя запустить выполнение нескольких задач параллельно. Кто то может сказать, а как же обработчик ожидания? Он запускается в том же потоке обработки и ожидает своей очереди на выполнение, даже если его время подошло, проверено. Думаю этот вопрос можно закрыть.

    Reply
  21. cool.vlad4

    (20) Nicolas_d, а я в (16) писал что-то иное? я и писал, что 1С платформа многопоточна, это настолько очевидно, что даже никакие мониторы ресурсы мне не надо запускать. но тем не менее вы поддержали doctorraza, который мне возразил. я слабо представляю, как можно написать гуевый(это не ругательство) клиент-сервер, используя один поток.

    Reply
  22. cool.vlad4

    (17) DoctorRoza, и вот вам инфа для размышления. при увеличении числа используемых потоков, программа наоборот может тормозить. это я к тому, чтобы вы не думали, что есть какая-то линейная зависимость число потоков — работа программы.

    Reply
  23. Nicolas_d

    (21) cool.vlad4, все верно поддержал, но только в том, о чем написал выше

    Reply
  24. cool.vlad4

    (23) Nicolas_d, ну и о чем? я разве писал, что «штатными средствами в одной внешней обработке или отчете» можно «запустить выполнение нескольких задач параллельно»? я как раз и написал «что из 1С кода без ВК, нет возможности управлять более чем одним потоком.» Ну и о чем спор?

    Reply
  25. alexpa2005

    Наконец-то внятный ответ на совершенно идиотское сообщение программы. Огромное спасибо за разъяснение технической подоплёки.

    Reply
  26. link_l

    порадовала публикация и комментарии к ней 🙂

    Reply
  27. FractonKireyev

    (17) DoctorRoza,

    Не о чем спорить. Распараллелить 1С по потокам можно либо через ВК, либо через фоновое задание (без разницы как запущенное). Но это всё запуск в явном виде.

    А всё остальное выполняется строго в одном потоке независимо от того, сколько потоков показывает монитор ресурсов (например, могу точно утверждать, что 1 поток выделяется на обновление отображения, не меньше 2-х на физическое чтение/запись БД и т.д. — отсюда и большое количество потоков в мониторе ресурсов).

    Не верите? Запустите диспетчер задач (обязательно на многоядерном/многопоточном компе, иначе просто ничего не увидите), запустите какую-нибудь навороченную сильно ресурсоёмкую и долго выполняющуюся задачу в 1С и посмотрите, какая будет нагрузка на ядра процессора.

    Reply
  28. insurgut

    (27) FractonKireyev,

    например, могу точно утверждать, что 1 поток выделяется на обновление отображения, не меньше 2-х на физическое чтение/запись БД и т.д. — отсюда и большое количество потоков в мониторе ресурсов

    Это и есть многопоточность приложения 🙂 Вы чего хотели, чтобы у вас чтение файла в несколько потоков выполнялось? Или операцию умножения или запрос к БД несколько потоков обрабатывали?

    Насколько я понял, основная суть недовольства тут не столько в многопоточности платформы 1С, сколько в неумении платформы распределить свои потоки по разным процессорам.

    Reply
  29. FractonKireyev

    (28) insurgut,

    Вы вообще не поняли сути моего поста. Это просто объяснение происхождения множества потоков ядра при одном сильно нагруженном потоке.

    Читайте внимательно мой текст (27) — там я пишу о том, как распараллелить вычисление.

    Reply
  30. insurgut

    (29) FractonKireyev, то, что синтаксис 1С не позволяет создавать и управлять потоками программисту — это понятно. С этим никто не спорит. Я же уточнил, что по сути говоря «однопоточная» люди подразумевают неспособность платформы 1С распределения своих порожденных потоков работать на нескольких физических/логических ядрах процессора.

    P.S.

    Это просто объяснение происхождения множества потоков ядра при одном сильно нагруженном потоке.

    уточню, что при одном сильно нагруженном потокепроцессе. 1 процесс — множество потоков. У одного потока — нет подмножества потоков 🙂 Будем называть вещи своими именами.

    Reply
  31. krv2k

    (0) Автор, напишите, пожалуйста, большими буквами, что данная рекомендация относится только к 32-разрядным ОС.

    Reply
  32. sanek_gk

    Данная рекомендация была актуальна лет 10 назад но никак не сейчас. комментарии повеселили …

    Reply
  33. krv2k

    (32)

    была актуальна лет 10 назад но никак не сейчас

    Обоснуйте.

    Reply
  34. lev6975

    (17) DoctorRoza,

    Да, совершенно верно…Прирост даст ещё разгон тактовой частоты процессора,а ядер ставь хоть сто, 1С не ускорить:))))))) :((((((((((

    И 8.3 точно такая же, ядронезависимая

    Reply
  35. lev6975

    У меня такое сообщение бывало, в основном, из — за кривых бухгалтерских ручек — достаточно создать документ от, скажем, 13 года(0013 года, вернее:-)))))))))))))), и, при пересчёте итогов какого — нибудь регистра, в который сделал движение этот документ, за 2000 лет, можно увидеть это весёлое оконце:-)))))))))0

    Reply
  36. haggart

    А кто-то знает почему движок 1С ядронезависимый. Почему он всегда работает с 1С ядром. Кстати, такая же фигня была и в WOT (World of tanks), она задействовала всегда одно ядро. Однако после большого количества упреков и наездов они подняли задействованность до 2 ядер. Где стоит ограничение на количество ядер? Явно не в СУБД не в .Net на котором написан виндовый клиент (поправьте, если ошибаюсь). Тогда в чем?

    Reply
  37. Nicolas_d

    (36) haggart, виндовый клиент писан не на .Net, чистые плюсы (С++). Ограничений на ядра нет, просто они не используются, лень компании делать полные реинжинириг и перестройку архитектуры существующего решения/платформы (может это будет в 9й версии платформы?). 8я платформа начинала развитие, когда многоядерность была в диковинку и никто не помышлял распараллеливать нагрузку программы на физические ядра. Компания нацелена на извлечение прибыли и пишут просто большой неоптимизированный код, как известно, железо нынче дешевле труда программистов. На многие просьбы писателей от конфигуратора 1С не дает ответов и решения. Конфигуратор в чистом виде просто убожище. Спасибо, что есть такие люди, как Орефков c его «снегопатом», который замечательно продолжает телепата из 7й платформы + плюшки опенконфа. Шота меня понесло ))

    Reply
  38. haggart

    (37) Nicolas_d,

    Спасибо, что разъяснили ситуацию. В 1С 7.7 действительно пользовался орефковскими примочками (телепат). Даже не знал, что он и для 8.2 разработал нечто подобное. Вы пользовались, удобная утилита (или как «снегопат» назвать)? Просто релизы у 1С 8.2 меняются достаточно часто, а я так смотрю, что для каждого релиза свой «снегопат» и последний для 8.2.16.

    Reply
  39. Nicolas_d

    (38) haggart, по поводу снегопата, являюсь пользователем демо версии, она остановилась на 8.2.18.104. Меня пока устраивает. Обновил компоненту SciColorer, чтобы не было выпадений при отладке и все работает очень неплохо. Рабочие релизы стоят денег, покупать пока не готов, потому как есть надежда, что с 1С завяжу в пользу нормального программирования под вэб и сервисы, да мобильные приложения. Пока приходится работать «многостаночником» и 1С всех платформ и конфигураций, web разработка, разработка настольных приложениях

    Reply
  40. StaticUnsafe

    1С не поддерживает разделение исполнения на независимые потоки. Но получится ли обойти это дело искусственно?Например, есть массив данных для обработки. Делим его на части и для каждой стартуем своё фоновое задание. Отдельный вопрос как синхронизировать результаты выполнения (писать в регистр или ТЗ в хранилище, например).

    Reply
  41. Nicolas_d

    (40) Osiris_, искусственно получается, я упоминал это в коментариях, т.е. фоновые задания выполняются в отдельном потоке, вроде даже каждое задание. Но, нагрузка так и идет на одно физическое ядро. Поэтому на рабочих серверах 1С рекомендуется выключать hyper threading, чтобы не делить физическое ядро на 2 виртуальных, дает некоторый прирост в скорости работы

    Reply
  42. vatkir

    (32) sanek_gk, вы либо неопытный разработчик, либо не разработчик. С каждым новым релизом вопрос оптимизации становится всё острее. Сейчас, например, на 8.3.408 опять регулярные падения платформы с этой ошибкой при обновлении больших конфигураций, таких как УТ 11.1 и более тяжелых. Решения такого типа, как увеличить размер допустимого использоваия ОЗУ процессом (bcdedit) уже не помогают. Решения пока нет

    Reply
  43. AllexSoft

    далеко не все вычисления можно распараллелить, пользователи работаю в разных потоках, от друг друга зависят только в пересекающихся блокировках в принципе… по поводу работы инструментов ТИИ и обновления конфигурации, они как были написаны в 2005 году, так и не развивались… поэтому они не рассчитаны на большие объемы в принципе, в собственно посмотрите как ТИИ делается на уровне запросов, там простой перебор записей, даже не выборка по Н-позиций

    Reply
  44. Brawler

    Бывали в недалеком прошлом такие ошибки на моем ПК, даже конфигуратор 8.2/8.3 падал при обновлениях. Винда 7 х86 2 Гига ОЗУ.

    Решение было по сути сразу найдено 4 гига памяти вместо двух, но вот незадача, на моем ПК все так же невозможно было произвести расчет проводок в ЗУП 2.5 для БП 2.0/3.0.

    Ну что, переставил еще и винду на 7 х64.

    Полет нормальный.

    Вообще пытался понять, когда падает прога от нехватки памяти и что страранно, даже при свободном гиге памяти валилась с ошибкой. Видимо, если прога хочет сожрать N метров памяти и ее нет, то она заранее вываливается с ошибкой, хотя уверен, что ну не нужен был ей гиг памяти, управилась бы и в том что было!, но…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *