gifts2017

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

Опубликовал Николай Дмитриев (Nicolas_d) в раздел Администрирование - Системное

Думаю, некоторые сталкивались с предупреждением о нехватке памяти и падением платформы при выполнении какой либо сложной/тяжелой обработки. Попытаемся выяснить, сколько же всего доступно памяти для платформы 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;
			КонецЕсли;
			
		КонецЦикла;
		
		БольшоеСлово = БольшоеСлово + СреднееСлово;
	
	КонецЦикла;
	
КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер
Большой текст в память 22
.epf 6,21Kb
17.12.13
22
.epf 1 6,21Kb Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение
Комментарии
1. Дмитрий Назаров (greenLiss) 17.12.13 19:50
На две недельки бы раньше... Мне из-за этой ошибки пришлось с ХР на 8 перейти ) (времени разбираться небыло)
Но всё равно, спасибо, буду знать :)
2. Ийон Тихий (cool.vlad4) 17.12.13 19:59
(1) greenLiss, автор статьи не сказал этого, но bcdedit какбэ намекает, что способ в статье на xp работать не будет.
3. Дмитрий Назаров (greenLiss) 17.12.13 20:02
(2) cool.vlad4, ну значит, не зря перешел :)
4. Алекс Одинэсник (Alex1Cnic) 18.12.13 08:47
А для Windows Xp нужно в boot.ini дописать параметр /3Gb:
например
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional RU" /noexecute=optin /fastdetect /3Gb
nsirotkin@mail.ru; greenLiss; +2 Ответить
5. Иван Иванов (Famza) 18.12.13 09:47
Я просто в boot.ini прописал ключ /3GB. (4) Опоздал)))
Можно добавить еще что-нибудь, но для ХР, имхо, это максимум что можно сделать, несмотря на неплохое железо.
6. slavok slavok (slavok123) 18.12.13 10:02
на 7-ке 32 битной аналогично было при обновлении даже, на 64-битной нет ошибки! хотя памяти одинаково было озу
7. Николай Дмитриев (Nicolas_d) 18.12.13 10:14
Чего я не указал в статье, так это конфиг железа и ОСи.
Тестирование проводилось на Win 7 Pro x64 Core i5-4670/ 16Gb оперативы. Версия 1С использовалась 8.2.18.104 обычные формы. Клиент тестил на Win XP Pro 3Gb оперативы. Для него критичен запуск на XP.
8. Сергей Иванов (xten) 18.12.13 10:16
А сколько в среднем по времени тест будет длиться при запуске с обычного пользовательского компа, например, core i3 4-8 ГБ ОЗУ ?
9. Николай Дмитриев (Nicolas_d) 18.12.13 10:35
(8) xten, у меня тест продлился примерно 30 минут, точно не засекал. Пообедал, чуть поработал, открыл - ошибка )) от ядрённости процессора не зависит, 1Ска однопоточна, зависит от частоты процессора. Мне кажется у вас будет так же, как и у меня, может чуть медленней. Я попытался и так оптимизировать рост строки по блокам, т.к. платформа в этом отношении достаточно тупая, в одном цикле при добавлении буквы за буквой примерно уже на 5Мб текста начинаются жуткие тормоза при сложении строк. Оптимально генерить блоки по мегабайту и добавлять к основной строке, собственно также и стоит организовывать чтение больших текстовых файлов, последовательно блоками.
10. Яков Коган (Yashazz) 18.12.13 11:15
Интересно, относится ли такое ограничение к строкам, получаемым как результат штатных функций 1С? Например, вы упоминаете парсинг сайта. ЭлементыФормы.ПолеХТМЛ.ПолучитьТекст() - как себя поведёт на таких объёмах, сыпанётся?
11. Николай Дмитриев (Nicolas_d) 18.12.13 11:23
(10) Yashazz, Если теоретически предположить что страницы объемом более 600 Мб бывают (как в моем синтетическом случае), то, я думаю, однозначно будет падение системы. Только перед этим она будет дооолго думать))
12. Сергей Борисов (juntatalor) 18.12.13 12:45
(9) Nicolas_d, была статейка про особенности конкатенации строк в 1С - смысл в том, что начиная с определенного размера "бесконечная" строка перестает хранится в памяти, и переносится во временный файл на жесткий диск, что существенно замедляет работу с ней.
13. Анянов Михаил (insurgut) 18.12.13 13:11
Панацея - клиент 1С 64-разрядный под Linux :)
14. Андрей Бурмистров (Andreynikus) 18.12.13 14:44
(9) Nicolas_d,
1Ска однопоточна

Откуда такие сведения?
15. Николай Дмитриев (Nicolas_d) 18.12.13 15:00
(14) Andreynikus, прям в мануал не тыкну, не видел такого, говорю о том,что вижу при загрузке процессора именно клиентом 1С:Предприятия. Явно видно, что любая обработка выполняется последовательно в один поток плюс "фризы" самой конфигурации при выполнении явно об этом говорят. Про сервер не говорю и не имею его ввиду. К сожалению, многопоточных вычислений в одной обработке выполнить пока невозможно.
16. Ийон Тихий (cool.vlad4) 18.12.13 15:01
(14) Andreynikus, ну очевидно, что 1С многопоточна. хотя бы потому, что это gui-евое приложение. вероятно он имел ввиду, что из 1С кода без ВК, нет возможности управлять более чем одним потоком.
17. Алексей Роза (DoctorRoza) 18.12.13 21:49
(16) вот Вам немного информации к размышлению. Имею УПП, объем базы 350 Гб, сервер, 120 Гб оперативы. При обновлении (то есть, просто сравнить конфигурации основную и новую поставщика) с помощью компа 4 Гб оперативны , core 2duo требуется время 30 минут. На компе 24 Гб оперативны, i7, требуется 3 минуты. При переносе темповских файлов 1С в ram-диск, то есть чтобы файлы сравнения конфигурации помещались не на физический диск , а в оперативную память или работе на SSD-диске, выигрыш по времени составил около 10%. Во всех процессах, контролировал загрузку железа в штатном мониторе ресурсов. Не знаю о какой многопоточности тут говорят, но как 1ядро напрягалось, так и напрягается сейчас. Никакие апгрейды железа для 1с, кроме как процессора, ощутимого выигрыша не дают! Не думаю, что об это сама 1с напишет, это все равно, что признаться в своей ущербности!
AllexSoft; StaticUnsafe; amon_ra; gorodok11; Nicolas_d; +5 Ответить 5
18. Николай Дмитриев (Nicolas_d) 19.12.13 10:11
19. Ийон Тихий (cool.vlad4) 19.12.13 10:20
(17) DoctorRoza, если признаетесь, что не знаете, что такое поток и многопоточность, тогда советую почитать чего-нибудь на эту тему. как вы собрались определять многопоточность по загрузке процессора - загадка, множество потоков работает в пределах одного процесса, и многопоточность запросто существует на одноядерных процессорах, (а иначе как на таких компьютерах работают другие программы?) короче советую вам обновить свои знания, ущербность 1С здесь ни при чем. забавно, что не зная такой простой вещи (это азы программирования), вы мне даете инфу для размышления )))
20. Николай Дмитриев (Nicolas_d) 19.12.13 10:36
Хех, наверное завершу холивар про многопоточность 1С. Давайте расставим все точки над Ё. Сама платформа (в нашем случае клиент 1С, неважно какой тонкий или толстый) многопоточна, в этом сомнений нет. Достаточно заглянуть в монитор ресурсов:

Нет никаких сомнений, что через энное место запустить даже отдельные потоки для обработки данных (вспоминаем фоновые процессы), все работает очень даже ничего.
Но остается непреложным факт того, о чем я и говорю изначально, штатными средствами в одной внешней обработке или отчете никак нельзя запустить выполнение нескольких задач параллельно. Кто то может сказать, а как же обработчик ожидания? Он запускается в том же потоке обработки и ожидает своей очереди на выполнение, даже если его время подошло, проверено. Думаю этот вопрос можно закрыть.
21. Ийон Тихий (cool.vlad4) 19.12.13 10:39
(20) Nicolas_d, а я в (16) писал что-то иное? я и писал, что 1С платформа многопоточна, это настолько очевидно, что даже никакие мониторы ресурсы мне не надо запускать. но тем не менее вы поддержали doctorraza, который мне возразил. я слабо представляю, как можно написать гуевый(это не ругательство) клиент-сервер, используя один поток.
22. Ийон Тихий (cool.vlad4) 19.12.13 10:43
(17) DoctorRoza, и вот вам инфа для размышления. при увеличении числа используемых потоков, программа наоборот может тормозить. это я к тому, чтобы вы не думали, что есть какая-то линейная зависимость число потоков - работа программы.
23. Николай Дмитриев (Nicolas_d) 19.12.13 10:49
(21) cool.vlad4, все верно поддержал, но только в том, о чем написал выше
24. Ийон Тихий (cool.vlad4) 19.12.13 12:29
(23) Nicolas_d, ну и о чем? я разве писал, что "штатными средствами в одной внешней обработке или отчете" можно "запустить выполнение нескольких задач параллельно"? я как раз и написал "что из 1С кода без ВК, нет возможности управлять более чем одним потоком." Ну и о чем спор?
25. alexpa (alexpa2005) 19.12.13 14:02
Наконец-то внятный ответ на совершенно идиотское сообщение программы. Огромное спасибо за разъяснение технической подоплёки.
26. link li (link_l) 19.12.13 14:34
порадовала публикация и комментарии к ней :)
27. Андрей Киреев (FractonKireyev) 19.12.13 20:59
(17) DoctorRoza,
Не о чем спорить. Распараллелить 1С по потокам можно либо через ВК, либо через фоновое задание (без разницы как запущенное). Но это всё запуск в явном виде.
А всё остальное выполняется строго в одном потоке независимо от того, сколько потоков показывает монитор ресурсов (например, могу точно утверждать, что 1 поток выделяется на обновление отображения, не меньше 2-х на физическое чтение/запись БД и т.д. - отсюда и большое количество потоков в мониторе ресурсов).
Не верите? Запустите диспетчер задач (обязательно на многоядерном/многопоточном компе, иначе просто ничего не увидите), запустите какую-нибудь навороченную сильно ресурсоёмкую и долго выполняющуюся задачу в 1С и посмотрите, какая будет нагрузка на ядра процессора.
28. Анянов Михаил (insurgut) 20.12.13 07:20
(27) FractonKireyev,
например, могу точно утверждать, что 1 поток выделяется на обновление отображения, не меньше 2-х на физическое чтение/запись БД и т.д. - отсюда и большое количество потоков в мониторе ресурсов

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

Насколько я понял, основная суть недовольства тут не столько в многопоточности платформы 1С, сколько в неумении платформы распределить свои потоки по разным процессорам.
29. Андрей Киреев (FractonKireyev) 20.12.13 10:05
(28) insurgut,
Вы вообще не поняли сути моего поста. Это просто объяснение происхождения множества потоков ядра при одном сильно нагруженном потоке.
Читайте внимательно мой текст (27) - там я пишу о том, как распараллелить вычисление.
30. Анянов Михаил (insurgut) 20.12.13 11:11
(29) FractonKireyev, то, что синтаксис 1С не позволяет создавать и управлять потоками программисту - это понятно. С этим никто не спорит. Я же уточнил, что по сути говоря "однопоточная" люди подразумевают неспособность платформы 1С распределения своих порожденных потоков работать на нескольких физических/логических ядрах процессора.
P.S.
Это просто объяснение происхождения множества потоков ядра при одном сильно нагруженном потоке.

уточню, что при одном сильно нагруженном потокепроцессе. 1 процесс - множество потоков. У одного потока - нет подмножества потоков :) Будем называть вещи своими именами.
31. Руслан Климачев (krv2k) 13.01.14 21:49
(0) Автор, напишите, пожалуйста, большими буквами, что данная рекомендация относится только к 32-разрядным ОС.
32. sanek sanek_gk (sanek_gk) 14.01.14 08:31
Данная рекомендация была актуальна лет 10 назад но никак не сейчас. комментарии повеселили ...
33. Руслан Климачев (krv2k) 14.01.14 15:25
(32)
была актуальна лет 10 назад но никак не сейчас

Обоснуйте.
34. Лев Корл (lev6975) 16.01.14 20:30
(17) DoctorRoza,
Да, совершенно верно...Прирост даст ещё разгон тактовой частоты процессора,а ядер ставь хоть сто, 1С не ускорить:))))))) :((((((((((
И 8.3 точно такая же, ядронезависимая
35. Лев Корл (lev6975) 16.01.14 20:34
У меня такое сообщение бывало, в основном, из - за кривых бухгалтерских ручек - достаточно создать документ от, скажем, 13 года(0013 года, вернее:-)))))))))))))), и, при пересчёте итогов какого - нибудь регистра, в который сделал движение этот документ, за 2000 лет, можно увидеть это весёлое оконце:-)))))))))0
36. Александр Дуденков (haggart) 16.01.14 20:36
А кто-то знает почему движок 1С ядронезависимый. Почему он всегда работает с 1С ядром. Кстати, такая же фигня была и в WOT (World of tanks), она задействовала всегда одно ядро. Однако после большого количества упреков и наездов они подняли задействованность до 2 ядер. Где стоит ограничение на количество ядер? Явно не в СУБД не в .Net на котором написан виндовый клиент (поправьте, если ошибаюсь). Тогда в чем?
37. Николай Дмитриев (Nicolas_d) 16.01.14 22:05
(36) haggart, виндовый клиент писан не на .Net, чистые плюсы (С++). Ограничений на ядра нет, просто они не используются, лень компании делать полные реинжинириг и перестройку архитектуры существующего решения/платформы (может это будет в 9й версии платформы?). 8я платформа начинала развитие, когда многоядерность была в диковинку и никто не помышлял распараллеливать нагрузку программы на физические ядра. Компания нацелена на извлечение прибыли и пишут просто большой неоптимизированный код, как известно, железо нынче дешевле труда программистов. На многие просьбы писателей от конфигуратора 1С не дает ответов и решения. Конфигуратор в чистом виде просто убожище. Спасибо, что есть такие люди, как Орефков c его "снегопатом", который замечательно продолжает телепата из 7й платформы + плюшки опенконфа. Шота меня понесло ))
Rothschild; +1 Ответить 1
38. Александр Дуденков (haggart) 16.01.14 22:27
(37) Nicolas_d,
Спасибо, что разъяснили ситуацию. В 1С 7.7 действительно пользовался орефковскими примочками (телепат). Даже не знал, что он и для 8.2 разработал нечто подобное. Вы пользовались, удобная утилита (или как "снегопат" назвать)? Просто релизы у 1С 8.2 меняются достаточно часто, а я так смотрю, что для каждого релиза свой "снегопат" и последний для 8.2.16.
39. Николай Дмитриев (Nicolas_d) 16.01.14 22:36
(38) haggart, по поводу снегопата, являюсь пользователем демо версии, она остановилась на 8.2.18.104. Меня пока устраивает. Обновил компоненту SciColorer, чтобы не было выпадений при отладке и все работает очень неплохо. Рабочие релизы стоят денег, покупать пока не готов, потому как есть надежда, что с 1С завяжу в пользу нормального программирования под вэб и сервисы, да мобильные приложения. Пока приходится работать "многостаночником" и 1С всех платформ и конфигураций, web разработка, разработка настольных приложениях
40. Osiris_ (StaticUnsafe) 17.01.14 09:54
1С не поддерживает разделение исполнения на независимые потоки. Но получится ли обойти это дело искусственно?Например, есть массив данных для обработки. Делим его на части и для каждой стартуем своё фоновое задание. Отдельный вопрос как синхронизировать результаты выполнения (писать в регистр или ТЗ в хранилище, например).
Прикрепленные файлы:
41. Николай Дмитриев (Nicolas_d) 17.01.14 10:10
(40) Osiris_, искусственно получается, я упоминал это в коментариях, т.е. фоновые задания выполняются в отдельном потоке, вроде даже каждое задание. Но, нагрузка так и идет на одно физическое ядро. Поэтому на рабочих серверах 1С рекомендуется выключать hyper threading, чтобы не делить физическое ядро на 2 виртуальных, дает некоторый прирост в скорости работы
42. Кирилл Ватагин (vatkir) 13.02.14 13:10
(32) sanek_gk, вы либо неопытный разработчик, либо не разработчик. С каждым новым релизом вопрос оптимизации становится всё острее. Сейчас, например, на 8.3.408 опять регулярные падения платформы с этой ошибкой при обновлении больших конфигураций, таких как УТ 11.1 и более тяжелых. Решения такого типа, как увеличить размер допустимого использоваия ОЗУ процессом (bcdedit) уже не помогают. Решения пока нет
43. Алексей Белоусов (AllexSoft) 13.02.14 13:40
далеко не все вычисления можно распараллелить, пользователи работаю в разных потоках, от друг друга зависят только в пересекающихся блокировках в принципе... по поводу работы инструментов ТИИ и обновления конфигурации, они как были написаны в 2005 году, так и не развивались... поэтому они не рассчитаны на большие объемы в принципе, в собственно посмотрите как ТИИ делается на уровне запросов, там простой перебор записей, даже не выборка по Н-позиций
44. Игорь Фелькер (Brawler) 14.03.14 23:26
Бывали в недалеком прошлом такие ошибки на моем ПК, даже конфигуратор 8.2/8.3 падал при обновлениях. Винда 7 х86 2 Гига ОЗУ.
Решение было по сути сразу найдено 4 гига памяти вместо двух, но вот незадача, на моем ПК все так же невозможно было произвести расчет проводок в ЗУП 2.5 для БП 2.0/3.0.
Ну что, переставил еще и винду на 7 х64.
Полет нормальный.

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