Ограничение кол-ва записей в регистре сведений #491762


#0 by Антиквар
Имеем 1С 8.1. База в файловом варианте. При попытке записи в регистр сведений очередных 50 тыс. строк вылетает ошибка: не хватает памяти. Раньше я думал, что памяти не хватает, чтобы записать в регистр всю таблицу значений из 500 тыщ строк. Разбил на блоки, каждый блок между НачатьТранзакцию и ЗавершитьТранзакцию, но все-равно такая ошибка. Сделал вообще отдельную запись блоков, т.е. записали 50 тыщ строк, через день например ещё 50 тыщ строк, и потихоньку все 500, когда время есть. Дак вот до 300 тыщ строк доходит, а следующие 50 уже не пишет, 1С все-равно вылетает с нехваткой памяти. Я нигде не слышал про ограничение кол-ва записей в регистре или про ограничение размера таблицы. База в файловом варианте, на всю базу по-моему есть ограничение в 4 гига. Но она не дотягивает до этого, даже намека нет. Т.е. дело именно в ограничении размера таблицы или в кол-ве записей. Не знаю правда, в файловом варианте регистры тоже в каких-то отдельных таблицах или нет ,в итоге то все в одном файле... Никто не сталкивался, а то не знаю чё и делать? Возможно SQL-вариант поможет, но клиент пока не готов на него перейти, а главное я не уверен что это поможет, чтобы клиента убеждать.
#1 by ASU_Diamond
#2 by Живой Ископаемый
2"Не знаю правда, в файловом варианте регистры тоже в каких-то отдельных таблицах или нет ,в итоге то все в одном файле..." - нет, 1СД - это компаунд, внутри куча файлов... от одного до нескольких на каждую таблицу.
#3 by ASU_Diamond
как записываешь, код в студию
#4 by Антиквар
Проблема похожа, но там прочитать не могут записанное, а я и записать не могу :) Т.е. возможно таблица с этим регистром превышает какой-то максимально допустимый размер. Памяти на сервере правда всего 2 гига ещё, я изначально на это и грешил, но когда стал писать блоками по 50 тыщ, то понял, что видимо не тут проблема. Сразу скажу, что на жестком диске места много :)
#5 by Антиквар
Раньше был такой код: Регистр = РегистрыСведений.Тратата.СоздатьНаборЗаписей; Разбил на блоки: НачатьТранзакцию; Для Каждого СтрокаТЗ ИЗ ТЗ Цикл Вылетала на записи блока, когда превышало 300 тысяч записей. Треттий вариант: я убрал "Регистр.Очистить;" И ТЗ создается каждый раз только по указанному количеству строк (сделали 300 тысяч, т.к. они заведомо грузятся за один раз). Т.е. в принципе это тот же второй вариант, только регистр не очищается перед добавлением к нему записей. Т.е. записали 300 тыщ записей по блокам, каждый из которых 50 тыщ строк, затем через день решили добавить, и на первом же блоке вылетает, т.е. регистр не может добавить в себя 50 тыщ записей, если в нем уже есть 300 тыщ.
#6 by Живой Ископаемый
а какая структура регистра?
#7 by ASU_Diamond
Регистр.Прочитать; -  на кой?
#8 by ASU_Diamond
Регистр.Записать(Ложь);
#9 by Сергей Д
В файловом варианте каждый объект (т.е. фактически таблица) не должна превышать 4Гб. У меня была файловая база 16Гб. Тормозила.... просто жуть.
#10 by Антиквар
Структура: три измерения: два объектного типа, одно строка 15 ресурсов: в основном не объектные (числа, строки) После Регистр.Прочитать у меня многоточие, я весь код не писал, только то, что относится непосредственно к этому регистру. А после прочитать есть действия по записи данных в другой регистр. А потом уже я очищал. В любом случае Прочитать тут роли не играет. Данный параметр мне не нужен, у меня не может быть неуникального набора измерений, это все анализируется ещё в момент формирования ТЗ, которую потом в регистр пишу. А у нас файл БД меньше 4Гб, так что размер одного регистра тем более не критичен в этом плане. В чем же косяк тогда ...
#11 by ASU_Diamond
сначала записываешь в один регистр, потом переносишь записи в другой и заного заносишь в первый?
#12 by ASU_Diamond
по 10к записей пробовал записывать?
#13 by Антиквар
Нет, переношу в архив. Да какая разница, это не суть. Ошибка при записи в конкретный регистр после 300 тыщ строк. Я специально ставил многоточие, там куча кода, не связанного с проблемой, поверьте. По 10 тыщ не пробовал. Но какая разница, допустим я уточню, что могу записать 320 тыщ, а 330 уже не смогу, проблема то останется.
#14 by ho0p
Может попробовать на другом компьютере с другими параметрами..
#15 by Fragster
у нас тут недавно 1 700 000 записей через автообмен пролезало (месяц перепровели) - вот это была жесть...
#16 by woody woodpecker
а как можно в файловой версии посмотреть размер таблиц? Есть база с планами обменами, так там по 300 МБ добавляется после каждого нового плана обмена. База под 3,5 ГБ, я так предполагаю, что основную лепту вносит регистр соответсвия объектов. Как посмотреть его размер и вообще оценить, не подходит ли он к ограничению?
#17 by acsent
Зачем транзакции? Это вам не 77
#18 by hhhh
если набор записей у тебя, то должен быть отбор. Так как отбора нет, то он первым делом у тебя удаляет из регистра 300000 записей, где-то их хранит, а потом добавляет 350000 записей. Без отбора набор записей оперирует с целым регистром.
#19 by EvgeniuXP
а если перед записью сначала сжать базу, а потом только записать 500 000 строк не удаляя ничего... возможно, что удалив, база-то всё-равно распухла... а лучше в тех.поддержку 1С написать... правда, долго ответа ждать...
#20 by Живой Ископаемый
2 какого размера строки, чтобы посчитать примерный объем... а также какие индексы есть - чтобы прикинуть размер индексного файла
#21 by Антиквар
Это сервер, загрузка и обработка данных идет около суток :) Остальные компы слабые очень чтоб такое пробовать :) Сначала было и без транзакций. Транзакции добавлены для того, чтобы была гарантия, что блок данных физически записался на диск. Т.к. думалось по-началу, что просто большой блок записать памяти не хватает. Как это отбора нет. Сложно его не заметить в маленьком куске кода :) Регистр.Отбор.Поле1.Использование=Истина; Дак размер базы не критичен ещё. Меньше двух гигов весь файл базы данных. В серьезных вопросах тех.поддержка ещё ни разу не помогла. А вот на форуме много и знающих, и опытных, шансов больше :)
#22 by Антиквар
Структруа регистра: ПериодичностьРегистраСведений: "Непериодический" - Измерение1: Тип:"СправочникСсылка.Справочник1" - Измерение2: Тип:"СправочникСсылка.Производители" - Ресурс7: Тип:"Булево" - Ресурс14: Тип:"СправочникСсылка.Контрагенты"
#23 by Just4Fun
если целью является создание подобия обычной таблицы, и заведомо, что она будет содержать большое количество записей, то лучше создать регистр накопления без ресурсов. при этом, для сравнения, запись порядка 50 тысяч записей в РС длится порядка 20 минут, а в РН - 30 секунд.
#24 by sash-ml
Кроме перехода на СКЛ ничего не поможет. Ограничение на размер одной таблицы в файловом варианте около 2гб. Связано с адресацией физического пространства :( Как вариант удалять старые ненужные записи из этого регистра
#25 by hhhh
какая разница, если у тебя в результате отбора остается 300000 записей, всё равно будет ситуация как в . Делай более конкретный отбор, по нескольким измерениям.
#26 by nbIx
А регистратор?
#27 by Антиквар
Регистр накопления конечно не совсем в тему, надо подумать. Только вот регистратор придется делать. Да и если все ресурсы перенести в измерения, то какая каша получится, теоретически станет возможна запись неуникальных записей... Короче переделок ужас сколько. Вот я и думаю, что только SQL у меня загрузка по одному измерению, т.е. отбор только по нему может быть. Мне и надо, чтобы в случае перезаписи все прежние записи удалились. А в случае добавления, просто добавлялись. Хочешь сказать, что после: "первым делом у тебя удаляет из регистра 300000 записей, где-то их хранит, а потом добавляет 350000 записей" ???
#28 by hhhh
ну да. Команда Регистр.Прочитать считывает 300000 записей в память. Команда Записать; записывает 350000 записей из памяти в базу. Перед этим естественно трет в базе то, что по этому отбору было. Попробуй не делать Прочитать - выбросить эту строчку, зато в конце поставь Записать(Ложь); - в режиме добавления записей. Может прокатит.
#29 by Живой Ископаемый
2 вполне возможно что при такой струкутуре - я вижу что есть строки неограниченной длины, да и фиксированной длины - 360 сивмолов... вполне возможно что твои 300 тысяч записей догоняют размер файла, в котором хранится РС до ... Опять же, если после добавления 300 тыс. записей размер самого файла 1Св8.1СД более 2 Гб, то это уже звоночек... и тогда тока переорганизация регистра или переход на клиент-серверную версию может тебе помочь...
#30 by Антиквар
понял мысль, надо подумать. Прочитать у меня там для другого делается, получится ли без этого... Спасибо В том то и дело, что может помочь, а может и не помочь :) Я уверен, что поможет, но вдруг нет, с клиентом не хорошо получится.
#31 by sash-ml
а если попробовать файловую ситему поменять с НТФС на НТФС но покруче или размер кластера поменять, идея бредовая канешно но кто его знает.....
#32 by acsent
Делай через менеджер записи без транзакций
#33 by Михаил Козлов
Может быть имеет смысл ограничить строки неограниченной длины?
#34 by Антиквар
я не админю сервак, и доступа к нему не имею. Удаленно только по 1С. Но посоветовать могу :) Раньше и было без транзакций. Транзакции я уж потом добавил, чтобы блоками физически на винт писать. Строки бывают очень большие. Даже не знаю сколько символов оставить чтоб инфу не обрезать. Но поэкспериментировать с этим можно, чтобы хоть причину найти, если она в этом конечно.
#35 by acsent
транзакция <> физически на винт
#36 by Живой Ископаемый
2 "? файл базы данных (.1CD) внутри организован как множество так называемых внутренних файлов. Каждой из таблиц базы данных соответствует до 4-х внутренних файлов: ? файл описания таблицы. В данном файле находится описание таблицы. ? файл записей данных. В этом файле находятся данные всех записей таблицы за исключением данных, содержащихся в полях неограниченной длины. ? файл индексов. В этом файле размещаются все индексы определенные для таблицы. Если не определено ни одного индекса, то этот файл отсутствует. ? файл значений неограниченной длины. В этом файле хранятся значения неограниченной длины, содержащиеся в полях таблицы. ? размер каждого из вышеперечисленных внутренних файлов не может превышать 4 Гбайт. ? длина ключа в индексе не может превышать 1920 байт."
#37 by nbIx
Мне кажется что структура РС хреновата, особо смущают строки неограниченной длины.
#38 by Hmster
без транзакций пробовал таким способом: а не пробовал? Запись=РегистрыСведений.Регистр.СоздатьМенеджерЗаписи; Запись. ...=...; ?
#39 by Антиквар
ну я понимаю, но я к тому, что 1С из своей памяти выгрузила спасибо. Значит проблема не в размере. строки в самом деле неограниченной длины в источнике :) вроде нет. Это чем-то лучше ?
#40 by Живой Ископаемый
2 "Значит проблема не в размере." - прошу прощения, пропустил как вы пришли к такому выводу?
#41 by Живой Ископаемый
а, понял, на основании . Но опять же - это в том случае если НТФС а не фат32
#42 by TeddySlaf
может не в тему, но "Регистр" не зарезервированное слово в 8-ке? в 7-ке - да.
#43 by Антиквар
Да, на основании того, что весь файл БД не более 2 гигов. Про файловую систему не в курсе, надо узнавать. Но на сервере думаю НТФС. Регистр - это я в коде просто заменил настоящее название, чтоб лучше читалось :)
#44 by Serg_1960
(может и бред скажу) Я бы все ресурсы регистра в справочник скинул, а в самом регистре - всего один ресурс (ссылка на запись справочника). Зачем и почему? Ну не нравится мне эти "Тип: Строка(0, Переменная)" и всё тут :)
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

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