Сборщик мусора в 1с8 #567612


#0 by YFred
Заметил что в 1с8 криво работает с оперативной памятью. Например в памяти ТаблицаЗначений на 20000 записей. ТабЗнач.Очистить не приводит к освобождению памяти. И создание объекта заново ТабЗнач = Новый ТаблицаЗначений, тоже не освобождает память. Что делать?
#0 by YFred
Заметил что в 1с8 криво работает с оперативной памятью. Например в памяти ТаблицаЗначений на 20000 записей. ТабЗнач.Очистить не приводит к освобождению памяти. И создание объекта заново ТабЗнач = Новый ТаблицаЗначений, тоже не освобождает память. Что делать?
#1 by qeos
а разве она сразу должна освободиться?
#2 by qeos
да и вообще, как ты увидишь что она занята?
#3 by also
ТабЗнач = неопределено;
#4 by H A D G E H O G s
Кто сказал, что в 1С есть сборщик мусора?
#5 by Попытка1С
Пля ну и название темы... Зашел только из-за этого )
#6 by H A D G E H O G s
Судя по тому, что 1С-ке монопенисуально наличия netframework - она не юзает мелкософтовский GC. Может свой сборщик, а может тупо - убил - освободил.
#7 by YFred
Сборщик по любому есть в 1с, память ведь должна как то освобождаться. Не понял причем тут netframework на нем не программил. Вопрос в следующем как освободить память занимаемую таблицей значений?
#8 by YFred
Я вижу что она занята в диспетчере задач windows.
#9 by ДенисЧ
неправильный критерий
#10 by Reaper_1c
А правильный ответ был дан на первой минуте...
#11 by YFred
Всегда найдется десяток клоунов которые ответят не в тему. Если не хватает внимания общайтесь в чатах. Нечего создавать помойку из серьезных тем.
#12 by Nexux
ТаблицаЗначений = Неопределено ?
#13 by Asmody
что в таблице?
#14 by Reaper_1c
Дятел, присваивание значения "неопределено" - универсальный деструктор снеговика.
#15 by cathode
Ответ на Ваш вопрос, мой твердолобый друг, был Вам любезно представлен в . Здесь собравшиеся наверняка оценили Ваши природную скромность и чувство такта, когда Вы благодарно назвали их клоунами в ответ. В 1С нет сборщика мусора, уважаемый, там лишь счетчики ссылок на объекты. Достаточно, или будете стучать клювом дальше?
#16 by БалбесВ1с
Пару раз в неделю сборщик мусора заглядывает в мой кабинет.Но он не из 1с точно.
#17 by YFred
ТаблизаЗначений = Неопределено не освобождает память. Во всяком случае в моем случае. В Таблице значений находятся остатки из регистра сведений (Пишу свертку базы с переносом остатков через COM/OLE). Лирическое отступление для твердолобых: Уважаемый  БалбесВ1с почитал темы созданные вами на форуме они мне показались тоже очень смешными, однако я не зашел в каждую и не поглумился над вами. Просто за... флудеры на форумах. Как я уже сказал выше не хватает общения общайтесь в чатах. Из 16 ответов в тему только 2-3.
#18 by YFred
По всем регистрам остатки перенес, застрял на одном СкидкиИНаценкиНоменклатуры вот для него то и не хватает памяти
#19 by milan
Делай частями, не ошибешься ;)
#20 by Reaper_1c
Для оси - не освобождает, а вот для самой 1Сины еще как освобождает. Кстати OLE-какашка жрет памяти точно больше, чем ТЗ на 20000 записей.
#21 by YFred
Я и делаю частями.
#22 by Jolly Roger
>Что делать? для начала покурить "область видимости переменных"...
#23 by YFred
Делаю так: 1.Запрос к оле базе 2.Выгружаю в ТабЗначOLE 3.Создаю ТабЗнач и конвертирую Олешную таблицу значение в ТабЗнач текущей базы. 4. Когда количество записей привышает 10000-20000 тыщ (устанавливается). Очищаю ТабЗнач (ТабЗнач = Неопределено типа чтобы освободить память) и продалжаю процесс.
#24 by YFred
Насколько я понимаю 1с освобождает память объектов только после завершения процедуры в которой они созданы.
#25 by Voronve
Покури в гугле аллокаторы. может просветление и наступит.
#26 by hhhh
да не освобождает она память для WINDOWS. Она в своих внутренних таблицах освобождает. Так что в диспетчере задач смотреть глупо.
#27 by БалбесВ1с
То что в называется ап.И кстати твердолобым обозвали тебя в .
#28 by Jolly Roger
освобождает...
#29 by YFred
Мне то не легче от того что 1с освобождает в своих внутренних таблицах. У меня оперативки не хватает.
#30 by Escander
ну вроде как сборщик мусора не интерактивно работает а типа по расписанию, типа раз в 1 мин что-ли... нужно уточнить в первоисточниках...
#31 by Escander
а сколько памяти-то?
#32 by YFred
У меня 4гб памяти, но это не важно ибо я делаю по частям.
#33 by el-gamberro
Автор олень. В 1С нет сборщика мусора. Память освобождать не нужно. Если руки чешутся заниматься сбором мусора нужно было выбирать себе другое направление работы.
#34 by Ненавижу 1С
сборщик мусора безусловно там есть, но как он устроен - подозреваю даже в 1С не скажут
#35 by Ненавижу 1С
сам ты олень
#36 by YFred
Может память и не нужно освобождать в ручную, но я хочу понять как она освобождается автоматически 1ской. Т.к. без этого мне не реализовать задуманного а это не есть гуд.
#37 by Voronve
хоть 32 гб. вынь проге выделяет 2гб, все остальное свап, и кривизна архитектуры.
#38 by YFred
Вот он зловредный код:
#39 by ДенисЧ
Как вариант... Не просто ТЗ = Неопределено, а перебрать каждую строку и каждому объекту = Неопределено, потом удалить строки, потом и таблицу... Помнится, в 77 мне такой фокус помогал...
#40 by Zapal
рассматривал вариант не выгружать в тз, а использовать выборку? я таким образом когда-то победил обработку выгрузки в битрикс, на больших объемах там тоже памяти не хватало
#41 by YFred
Проверил не помогло.
#42 by dmpl
1С может и 3 Гб слопать при соответствующем ключике в boot.ini
#43 by Reaper_1c
*Сидит и радуется, что не поленился изучить конвертацию данных*
#44 by Jolly Roger
епта... намекаю последний раз: см. ...
#45 by dmpl
Кто сидит? Впрочем, конвертация тоже падает из-за недостатка памяти.
#46 by Torquader
Про OLE надо говорить отдельно. Умная система Windows для каждого OLE-объекта создаёт сервер, если, конечно, не сказано, что сервер может обслуживать несколько объектов сразу. Если у нас сервер живёт в своём процессе, как это происходит в 1С, то между процессами устанавливается взаимодействие, через которое передаются данные объектов. Точнее, передаются "указатели" по которым эти объекты можно найти, так как сами объекты остаются внутри своего процесса. За передачу отвечает интерфейс IMarshal, который определяет, как и что переносить. Далее, когда в клиентском приложении будет создано много объектов из сервера, находящегося в другом процессе, то создаются заглушки, которые живут какое-то время после того, как их освободят, так как всю информацию об освобождении объектов нужно доставить родному процессу. То есть в вашем случае вы создаёте таблицу с "заглушками". После освобождения таблицы эти заглушки переходят в состояние обнулённого счётчика ссылок и готовы умереть. Точнее, из-за оптимизации они попадают в "свободный пул", то есть будут выданы другому OLE-объекту. Далее, родной для объекта процесс получает уведомление о том, что его объекты другому процессу не нужны, и должен их разрушить, но, если они используются ещё и внутри его самого, то они останутся жить - вероятно, что по этой же причине могут остаться жить и "звглушки" в памяти нашего процесса, чтобы не выполнять "стыковку" ещё раз. И ещё, вся эта вещь общается через Remore Procedure Call и сообщение Windows WM_COPYDATA, причём большой объём данных может передаваться в одном сообщении, и когда ему просто нет места в адресном пространстве другого процесса (а для этого его не обязательно занимать всё, а можно только сильно фрагментировать), то получаем ошибку. Поэтому, лучше получать как можно меньше объектов OLE из другого процесса, а вместо них обмениваться строками и массивами малой размерности, чтобы им место находилось всегда.
#47 by YFred
епта а зачем намекать, мы что тут в загадки играем?
#48 by Jolly Roger
ты можешь сказать какая область видимости ТабДвижOLE и ТабДвиж в ? я не могу...
#49 by Jolly Roger
+ и кто из нас загадки загадывает?
#50 by YFred
Это не относится к моей проблеме как мне кажется. Т.к. у меня выполняется запрос к базе OLE Затем выгружается результат запроса в таблицу значений и эта таблица не жрет много памяти. Память начинает улетучиваться когда я заполняю таблицу значений в рабочей базе, объектами же рабочей базы. Но мне не понятно почему ТЗ с оле объектами не жрет память, а таблица с объектами рабочей базы полностью идентичная с тем же кол-вом строк и колоно жрет.
#51 by YFred
Область видимости ТабДвижOLE и ТабДвиж в приделах процедуры кусок которой я привел в
#52 by YFred
Может память занимает не ТабДвиж, а что то другое?
#53 by Jolly Roger
ну тогда память, занятая ТабДвиж должна освобождаться при завершении этой процедуры...
#54 by YFred
Проблема в том что память заканчивается раньше чем эта процедура :)
#55 by Jolly Roger
ну дык дроби данные...
#56 by H A D G E H O G s
Код выполняешь с закомменченной ??
#57 by Torquader
Есть ещё подозрение, что вместо ссылок на объекты в таблицу складываются сами объекты - тогда память кушается только в путь.
#58 by YFred
ДА
#59 by H A D G E H O G s
Тогда код процедуры НайтиОбъектCOMвБазе в студию!
#60 by НЕА123
может ОФФ. в 77 для обработок замечал, что память в диспетчере освобождается только при убиении обработки. использует ли сам 1С "высвобожденную" память - хз.
#61 by Fragster
в запросе - освобождает, если УДАЛИТЬ ВременнаяТаблица; делать, в коде - кажись по окончанию процедуры и перед возвратом в интерактивный режим
#62 by YFred
в таблице ссылки
#63 by YFred
Код функции НайтиОбъектCOMвБазе(ЗначComПер)
#64 by H A D G E H O G s
100% уверенности что примитивное значение вернется?
#65 by eklmn
ИМХО неопределено не поможет, переназови по другому ТабДжиж2 например :)                Для каждого КолонкаТабДвижOLE из ТабДвижOLE.Колонки Цикл
#66 by YFred
да, проверено
#67 by YFred
Проблема не решена... Есть умные мысли?
#68 by Fragster
написать алгоритм так, чтобы он не жрал столько памяти
#69 by YFred
Тоже об этом думаю. Только еще не придумал как.
#70 by dmpl
Если не хватает чуть-чуть - то ключик /3GB в boot.ini поставить. Если не пройдет - то разбить выгрузку на части и грузить по частям, перезапуская 1С после загрузки каждой части. Увы, память жрет 1С, а не алгоритм.
#71 by DmitrO
Вопрос: когда заканчивается память? На второй итерации по ограничению количества строк? Другими словами: сколько документов ввода остатков успевает оформиться до окончания памяти, соответственно сколько раз успевает отработать это место: ТабДвиж = Неопределено; ?
#72 by Лефмихалыч
юзай КД, не изобретай волсопедов
#73 by dmpl
КД также валится, причем на не самых больших базах.
#74 by DmitrO
я вообще не понимаю зачем люди так пишут.. надо же понимать что: - результат запроса хранит данные в памяти (для больших выборок вроде как может использовать врем файлы, хотя может быть это только сервер так делает) - ТЗ хранит данные в памяти. - документ объект хранит данные тоже в памяти. В результате обсуждаемого алгоритма по сути дела одни и те же данные хранятся в памяти 4х экземплярах - не эффективно.
#75 by Asmody
[память жрет 1С, а не алгоритм] — восхитительно! Напиши в рамочку и повесть на стенку, чтобы все видели твою неспособность думать
#76 by YFred
В зависимости от ограничение которое я задаю, если 10000 то раз 5 успевает выполнится
#77 by YFred
Какие данные хранятся в 4х экземплярах в моем алгоритме? Что ТЗ хранит данные в памяти это и ежу понятно. Не понятно почему память не освобождается когда уничтожается объект ТЗ. Я не понимаю почему полная ОЛЕ ТЗ с сылками ОЛЕ умещается в памяти, а когда я ее преобразую в ТЗ текущей базы  с ссылками на объекты текущей базы, она раздувается в памяти больше чем в 10 раз??? Где ошибка в алгоритме?
#78 by YFred
:)
#79 by Икогнито
заметил, что ты криво работаешь с возможностями платформы 1с8. Скока кодю, ни разу не возникала ситуация, когда нужно было держать в оперативной памяти компа ТаблицаЗначений аж на 20000 строк
#80 by YFred
если знаток, по подскажи как надо.
#81 by Икогнито
Батенька, надо запросами и времеными таблицами.
#82 by Икогнито
+ Запомни, основной способ получения выборки информации на платформе 8 - это запрос.
#83 by Jaffar
посмотри еще раз .
#84 by akaBrr
Зачем вообще создавать таблицу в своей базе? Сразу нельзя писать документы, обрабатывая ОЛЕ таблицу?
#85 by Икогнито
продалжай процесс
#86 by Jaffar
ниумею.
#87 by Serginio1
Почитай про менеджеры памяти для нативного кода. Кроме того бывает зарезервированная и откомиченная память. А также память в нативных (да и в управляемых для LOH) подвергается фрагментации
#88 by G-Tesse
Попробуй убивать в отдельной процедуре. Как-то так: А вообще настрой технологический журнал на утечки памяти.
#89 by YFred
Переписал код без использования таблиц значений. Память не жрется, фсе формируется. Сначала переписал без использования промежуточной таблицы значений, все равно была утечка памяти. Сделал вывод что нельзя использовать ОЛЕ таблицы значений типа: ТабДвижOLE = OLEСоединение.NewObject("ТаблицаЗначений");
#90 by YFred
Всем спасибо!
#91 by Fragster
не, там дело в том, что если есть результат запроса - то обходить его оптимальнее не через выгрузку в ТЗ, а через выборку из результата
#92 by Сергей Д
В Дельфях было так: освобождаемая память не сразу отдается ОС, а некоторое время держится собственным менеджером памяти. По принципу - а вдруг нужно будет сейчас еще кому-то, вот она уже есть, не надо клянчить у системы.
#93 by Serginio1
Возможно проблема с подсчетом ссылок. Такая проблема была еще в семерке. Кстати а работаешь через V82.Application или v82.COMConnector
#94 by Torquader
Так в Windows есть глобальная таблица дескрипторов, в которой выделяется память для всех процессов, локальная таблица дескрипторов, в которой выделяется память для процесса, то есть выделение происходит в виртуальной памяти процесса, а также куча, то есть набор памяти из которого выделяются куски, но у системы он запрошен единым целым, иногда только выполняется увеличение размера кучи. Что касается OLE-конструкций, то они в процессе создания имеют один объём (уникальная ссылка на сам объект для интерфейса IMarshal), а в процессе работы с ними просто "обрастают подробностями", то есть добавляются ссылки для методов и параметров и т.п. - память теряется. То есть вполне вероятно, что когда ты создаёшь объекты, то они в память влазят, а когда каждый объект подключает свои методы (в 1С позднее связывание), то память кончается.
#95 by Jaffar
вот еще по теме: Глюк в 1С 8 с зависанием обработки в памяти (не обновляется код)
#96 by Torquader
Циклические ссылки - это бич любого языка, где нет явного управления памятью. В том же VbScript если создать два объекта, которые внутри себя хранят ссылки друг на друга, то они остаются в памяти до завершения сценария. Видимо, в 1С есть что-то подобное.
#97 by YFred
У меня 8.1
#98 by Serginio1
Ну тогда V81.Application или v81.COMConnector
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С