#0
by YFred
Заметил что в 1с8 криво работает с оперативной памятью. Например в памяти ТаблицаЗначений на 20000 записей. ТабЗнач.Очистить не приводит к освобождению памяти. И создание объекта заново ТабЗнач = Новый ТаблицаЗначений, тоже не освобождает память. Что делать?
#0
by YFred
Заметил что в 1с8 криво работает с оперативной памятью. Например в памяти ТаблицаЗначений на 20000 записей. ТабЗнач.Очистить не приводит к освобождению памяти. И создание объекта заново ТабЗнач = Новый ТаблицаЗначений, тоже не освобождает память. Что делать?
#6
by H A D G E H O G s
Судя по тому, что 1С-ке монопенисуально наличия netframework - она не юзает мелкософтовский GC. Может свой сборщик, а может тупо - убил - освободил.
#7
by YFred
Сборщик по любому есть в 1с, память ведь должна как то освобождаться. Не понял причем тут netframework на нем не программил. Вопрос в следующем как освободить память занимаемую таблицей значений?
#11
by YFred
Всегда найдется десяток клоунов которые ответят не в тему. Если не хватает внимания общайтесь в чатах. Нечего создавать помойку из серьезных тем.
#15
by cathode
Ответ на Ваш вопрос, мой твердолобый друг, был Вам любезно представлен в . Здесь собравшиеся наверняка оценили Ваши природную скромность и чувство такта, когда Вы благодарно назвали их клоунами в ответ. В 1С нет сборщика мусора, уважаемый, там лишь счетчики ссылок на объекты. Достаточно, или будете стучать клювом дальше?
#17
by YFred
ТаблизаЗначений = Неопределено не освобождает память. Во всяком случае в моем случае. В Таблице значений находятся остатки из регистра сведений (Пишу свертку базы с переносом остатков через COM/OLE). Лирическое отступление для твердолобых: Уважаемый БалбесВ1с почитал темы созданные вами на форуме они мне показались тоже очень смешными, однако я не зашел в каждую и не поглумился над вами. Просто за... флудеры на форумах. Как я уже сказал выше не хватает общения общайтесь в чатах. Из 16 ответов в тему только 2-3.
#18
by YFred
По всем регистрам остатки перенес, застрял на одном СкидкиИНаценкиНоменклатуры вот для него то и не хватает памяти
#20
by Reaper_1c
Для оси - не освобождает, а вот для самой 1Сины еще как освобождает. Кстати OLE-какашка жрет памяти точно больше, чем ТЗ на 20000 записей.
#23
by YFred
Делаю так: 1.Запрос к оле базе 2.Выгружаю в ТабЗначOLE 3.Создаю ТабЗнач и конвертирую Олешную таблицу значение в ТабЗнач текущей базы. 4. Когда количество записей привышает 10000-20000 тыщ (устанавливается). Очищаю ТабЗнач (ТабЗнач = Неопределено типа чтобы освободить память) и продалжаю процесс.
#24
by YFred
Насколько я понимаю 1с освобождает память объектов только после завершения процедуры в которой они созданы.
#26
by hhhh
да не освобождает она память для WINDOWS. Она в своих внутренних таблицах освобождает. Так что в диспетчере задач смотреть глупо.
#29
by YFred
Мне то не легче от того что 1с освобождает в своих внутренних таблицах. У меня оперативки не хватает.
#30
by Escander
ну вроде как сборщик мусора не интерактивно работает а типа по расписанию, типа раз в 1 мин что-ли... нужно уточнить в первоисточниках...
#33
by el-gamberro
Автор олень. В 1С нет сборщика мусора. Память освобождать не нужно. Если руки чешутся заниматься сбором мусора нужно было выбирать себе другое направление работы.
#34
by Ненавижу 1С
сборщик мусора безусловно там есть, но как он устроен - подозреваю даже в 1С не скажут
#36
by YFred
Может память и не нужно освобождать в ручную, но я хочу понять как она освобождается автоматически 1ской. Т.к. без этого мне не реализовать задуманного а это не есть гуд.
#39
by ДенисЧ
Как вариант... Не просто ТЗ = Неопределено, а перебрать каждую строку и каждому объекту = Неопределено, потом удалить строки, потом и таблицу... Помнится, в 77 мне такой фокус помогал...
#40
by Zapal
рассматривал вариант не выгружать в тз, а использовать выборку? я таким образом когда-то победил обработку выгрузки в битрикс, на больших объемах там тоже памяти не хватало
#46
by Torquader
Про OLE надо говорить отдельно. Умная система Windows для каждого OLE-объекта создаёт сервер, если, конечно, не сказано, что сервер может обслуживать несколько объектов сразу. Если у нас сервер живёт в своём процессе, как это происходит в 1С, то между процессами устанавливается взаимодействие, через которое передаются данные объектов. Точнее, передаются "указатели" по которым эти объекты можно найти, так как сами объекты остаются внутри своего процесса. За передачу отвечает интерфейс IMarshal, который определяет, как и что переносить. Далее, когда в клиентском приложении будет создано много объектов из сервера, находящегося в другом процессе, то создаются заглушки, которые живут какое-то время после того, как их освободят, так как всю информацию об освобождении объектов нужно доставить родному процессу. То есть в вашем случае вы создаёте таблицу с "заглушками". После освобождения таблицы эти заглушки переходят в состояние обнулённого счётчика ссылок и готовы умереть. Точнее, из-за оптимизации они попадают в "свободный пул", то есть будут выданы другому OLE-объекту. Далее, родной для объекта процесс получает уведомление о том, что его объекты другому процессу не нужны, и должен их разрушить, но, если они используются ещё и внутри его самого, то они останутся жить - вероятно, что по этой же причине могут остаться жить и "звглушки" в памяти нашего процесса, чтобы не выполнять "стыковку" ещё раз. И ещё, вся эта вещь общается через Remore Procedure Call и сообщение Windows WM_COPYDATA, причём большой объём данных может передаваться в одном сообщении, и когда ему просто нет места в адресном пространстве другого процесса (а для этого его не обязательно занимать всё, а можно только сильно фрагментировать), то получаем ошибку. Поэтому, лучше получать как можно меньше объектов OLE из другого процесса, а вместо них обмениваться строками и массивами малой размерности, чтобы им место находилось всегда.
#50
by YFred
Это не относится к моей проблеме как мне кажется. Т.к. у меня выполняется запрос к базе OLE Затем выгружается результат запроса в таблицу значений и эта таблица не жрет много памяти. Память начинает улетучиваться когда я заполняю таблицу значений в рабочей базе, объектами же рабочей базы. Но мне не понятно почему ТЗ с оле объектами не жрет память, а таблица с объектами рабочей базы полностью идентичная с тем же кол-вом строк и колоно жрет.
#53
by Jolly Roger
ну тогда память, занятая ТабДвиж должна освобождаться при завершении этой процедуры...
#57
by Torquader
Есть ещё подозрение, что вместо ссылок на объекты в таблицу складываются сами объекты - тогда память кушается только в путь.
#60
by НЕА123
может ОФФ. в 77 для обработок замечал, что память в диспетчере освобождается только при убиении обработки. использует ли сам 1С "высвобожденную" память - хз.
#61
by Fragster
в запросе - освобождает, если УДАЛИТЬ ВременнаяТаблица; делать, в коде - кажись по окончанию процедуры и перед возвратом в интерактивный режим
#65
by eklmn
ИМХО неопределено не поможет, переназови по другому ТабДжиж2 например :) Для каждого КолонкаТабДвижOLE из ТабДвижOLE.Колонки Цикл
#70
by dmpl
Если не хватает чуть-чуть - то ключик /3GB в boot.ini поставить. Если не пройдет - то разбить выгрузку на части и грузить по частям, перезапуская 1С после загрузки каждой части. Увы, память жрет 1С, а не алгоритм.
#71
by DmitrO
Вопрос: когда заканчивается память? На второй итерации по ограничению количества строк? Другими словами: сколько документов ввода остатков успевает оформиться до окончания памяти, соответственно сколько раз успевает отработать это место: ТабДвиж = Неопределено; ?
#74
by DmitrO
я вообще не понимаю зачем люди так пишут.. надо же понимать что: - результат запроса хранит данные в памяти (для больших выборок вроде как может использовать врем файлы, хотя может быть это только сервер так делает) - ТЗ хранит данные в памяти. - документ объект хранит данные тоже в памяти. В результате обсуждаемого алгоритма по сути дела одни и те же данные хранятся в памяти 4х экземплярах - не эффективно.
#75
by Asmody
[память жрет 1С, а не алгоритм] — восхитительно! Напиши в рамочку и повесть на стенку, чтобы все видели твою неспособность думать
#77
by YFred
Какие данные хранятся в 4х экземплярах в моем алгоритме? Что ТЗ хранит данные в памяти это и ежу понятно. Не понятно почему память не освобождается когда уничтожается объект ТЗ. Я не понимаю почему полная ОЛЕ ТЗ с сылками ОЛЕ умещается в памяти, а когда я ее преобразую в ТЗ текущей базы с ссылками на объекты текущей базы, она раздувается в памяти больше чем в 10 раз??? Где ошибка в алгоритме?
#79
by Икогнито
заметил, что ты криво работаешь с возможностями платформы 1с8. Скока кодю, ни разу не возникала ситуация, когда нужно было держать в оперативной памяти компа ТаблицаЗначений аж на 20000 строк
#82
by Икогнито
+ Запомни, основной способ получения выборки информации на платформе 8 - это запрос.
#84
by akaBrr
Зачем вообще создавать таблицу в своей базе? Сразу нельзя писать документы, обрабатывая ОЛЕ таблицу?
#87
by Serginio1
Почитай про менеджеры памяти для нативного кода. Кроме того бывает зарезервированная и откомиченная память. А также память в нативных (да и в управляемых для LOH) подвергается фрагментации
#88
by G-Tesse
Попробуй убивать в отдельной процедуре. Как-то так: А вообще настрой технологический журнал на утечки памяти.
#89
by YFred
Переписал код без использования таблиц значений. Память не жрется, фсе формируется. Сначала переписал без использования промежуточной таблицы значений, все равно была утечка памяти. Сделал вывод что нельзя использовать ОЛЕ таблицы значений типа: ТабДвижOLE = OLEСоединение.NewObject("ТаблицаЗначений");
#91
by Fragster
не, там дело в том, что если есть результат запроса - то обходить его оптимальнее не через выгрузку в ТЗ, а через выборку из результата
#92
by Сергей Д
В Дельфях было так: освобождаемая память не сразу отдается ОС, а некоторое время держится собственным менеджером памяти. По принципу - а вдруг нужно будет сейчас еще кому-то, вот она уже есть, не надо клянчить у системы.
#93
by Serginio1
Возможно проблема с подсчетом ссылок. Такая проблема была еще в семерке. Кстати а работаешь через V82.Application или v82.COMConnector
#94
by Torquader
Так в Windows есть глобальная таблица дескрипторов, в которой выделяется память для всех процессов, локальная таблица дескрипторов, в которой выделяется память для процесса, то есть выделение происходит в виртуальной памяти процесса, а также куча, то есть набор памяти из которого выделяются куски, но у системы он запрошен единым целым, иногда только выполняется увеличение размера кучи. Что касается OLE-конструкций, то они в процессе создания имеют один объём (уникальная ссылка на сам объект для интерфейса IMarshal), а в процессе работы с ними просто "обрастают подробностями", то есть добавляются ссылки для методов и параметров и т.п. - память теряется. То есть вполне вероятно, что когда ты создаёшь объекты, то они в память влазят, а когда каждый объект подключает свои методы (в 1С позднее связывание), то память кончается.
#96
by Torquader
Циклические ссылки - это бич любого языка, где нет явного управления памятью. В том же VbScript если создать два объекта, которые внутри себя хранят ссылки друг на друга, то они остаются в памяти до завершения сценария. Видимо, в 1С есть что-то подобное.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Ошибка при работе через терминальную сессию в 1С8. Вылетает 1с8.exe!
- Как получить Фамилию ФизЛица в родительном падеже в 1С8.0 или 1С8.1?
- Запуск через ярлык 1С8.2 базы 1С8.1
- v7: Почистить 1Sblob от мусора в хвостах
- Перенос данных из 1С8 в 1С8 РИБ
- сборщик мобильного приложения - ошибка при создании ключа
- Перевод 1С8.1 на 1С8.3 нужно делать через 1С8.2?
В этой группе 1С
- Удаление ключей аналитики УТ11
- УФ.Недостаточно прав для работы с таблицей "РегистрРасчета.Начисления.Перерасчет
- v8: Правда ли так страшен экзамен 1С Специалист по платформе
- Ошибка в расчете остатков при перепроведении документа
- v7: ЗиК Выплатили больше, чем начислили
- как в печатную форму док чек ККМ в 1С УТ 10.3 добавить подпись?
- Операция бухгалтерская
- из 7.7 подключиться к базе данных sql 2005 (mdf файлу)
- Как создать несколько процессов rphost?
- СКД. Программно изменить выражение ресурса
- Уникальный идентификатор для перечисления
- Закрытие 20, 23, 24, 25 счета в документе Закрытие месяца
- Как открыть pdf-файл через веб-клиент, не задавая вопросов юзеру?
- CryptoPro и CryptoArm. Нужен совет.
- Где хранятся данные календаря в Outlook (т.е. заметки, встречи и т.п.)
- глТекущийПользователь в глобальном модуле
- Управляема Форма: нажатие на картинку в табличной части
- Как заменить тип NULL на пустое значение типа СправочникСсылка
- пропала выравнивающая линия на форме
- включить объект в состав РИБ