![]() |
|
Ограничение кол-ва записей в регистре сведений | ☑ | ||
---|---|---|---|---|
0
Антиквар
06.07.10
✎
13:41
|
Имеем 1С 8.1. База в файловом варианте.
При попытке записи в регистр сведений очередных 50 тыс. строк вылетает ошибка: не хватает памяти. Раньше я думал, что памяти не хватает, чтобы записать в регистр всю таблицу значений из 500 тыщ строк. Разбил на блоки, каждый блок между НачатьТранзакцию() и ЗавершитьТранзакцию(), но все-равно такая ошибка. Сделал вообще отдельную запись блоков, т.е. записали 50 тыщ строк, через день например ещё 50 тыщ строк, и потихоньку все 500, когда время есть. Дак вот до 300 тыщ строк доходит, а следующие 50 уже не пишет, 1С все-равно вылетает с нехваткой памяти. Я нигде не слышал про ограничение кол-ва записей в регистре или про ограничение размера таблицы. База в файловом варианте, на всю базу по-моему есть ограничение в 4 гига. Но она не дотягивает до этого, даже намека нет. Т.е. дело именно в ограничении размера таблицы или в кол-ве записей. Не знаю правда, в файловом варианте регистры тоже в каких-то отдельных таблицах или нет ,в итоге то все в одном файле... Никто не сталкивался, а то не знаю чё и делать? Возможно SQL-вариант поможет, но клиент пока не готов на него перейти, а главное я не уверен что это поможет, чтобы клиента убеждать. |
|||
1
ASU_Diamond
06.07.10
✎
13:44
|
||||
2
Живой Ископаемый
06.07.10
✎
13:46
|
2(0)"Не знаю правда, в файловом варианте регистры тоже в каких-то отдельных таблицах или нет ,в итоге то все в одном файле..." - нет, 1СД - это компаунд, внутри куча файлов... от одного до нескольких на каждую таблицу.
|
|||
3
ASU_Diamond
06.07.10
✎
13:47
|
(0) как записываешь, код в студию
|
|||
4
Антиквар
06.07.10
✎
14:37
|
(1) Проблема похожа, но там прочитать не могут записанное, а я и записать не могу :)
(2) Т.е. возможно таблица с этим регистром превышает какой-то максимально допустимый размер. Памяти на сервере правда всего 2 гига ещё, я изначально на это и грешил, но когда стал писать блоками по 50 тыщ, то понял, что видимо не тут проблема. Сразу скажу, что на жестком диске места много :) |
|||
5
Антиквар
06.07.10
✎
14:55
|
(3)
Раньше был такой код: Регистр = РегистрыСведений.Тратата.СоздатьНаборЗаписей(); Регистр.Отбор.Поле1.Значение = ...; Регистр.Отбор.Поле1.Использование=Истина; Регистр.Прочитать(); ..... Регистр.Очистить(); ТЗ = Регистр.ВыгрузитьКолонки(); ... Регистр.Загрузить(ТЗ); // в таблице значений ТЗ содержатся 500 тыс. строк Регистр.Записать(); // вот на этой строчке, при записи непосредственной и происходила ошибка. Разбил на блоки: НачатьТранзакцию(); Для Каждого СтрокаТЗ ИЗ ТЗ Цикл Менеджер = Регистр.Добавить(); Менеджер.Поле1 = СтрокаТЗ.ПолеТЗ1; Менеджер.Поле2 = СтрокаТЗ.ПолеТЗ2; // и т.д. Если счетчик = 50000 Тогда // уж не буду приводить как он считается :) Регистр.Записать(); ЗафиксироватьТранзакцию(); НачатьТранзакцию(); КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); Вылетала на записи блока, когда превышало 300 тысяч записей. Треттий вариант: я убрал "Регистр.Очистить();" И ТЗ создается каждый раз только по указанному количеству строк (сделали 300 тысяч, т.к. они заведомо грузятся за один раз). Т.е. в принципе это тот же второй вариант, только регистр не очищается перед добавлением к нему записей. Т.е. записали 300 тыщ записей по блокам, каждый из которых 50 тыщ строк, затем через день решили добавить, и на первом же блоке вылетает, т.е. регистр не может добавить в себя 50 тыщ записей, если в нем уже есть 300 тыщ. |
|||
6
Живой Ископаемый
06.07.10
✎
14:57
|
а какая структура регистра?
|
|||
7
ASU_Diamond
06.07.10
✎
14:59
|
(5) Регистр.Прочитать(); - на кой?
|
|||
8
ASU_Diamond
06.07.10
✎
15:01
|
Регистр.Записать(Ложь);
|
|||
9
Сергей Д
06.07.10
✎
15:01
|
В файловом варианте каждый объект (т.е. фактически таблица) не должна превышать 4Гб. У меня была файловая база 16Гб. Тормозила.... просто жуть.
|
|||
10
Антиквар
06.07.10
✎
15:55
|
(6) Структура:
три измерения: два объектного типа, одно строка 15 ресурсов: в основном не объектные (числа, строки) (7) После Регистр.Прочитать() у меня многоточие, я весь код не писал, только то, что относится непосредственно к этому регистру. А после прочитать есть действия по записи данных в другой регистр. А потом уже я очищал. В любом случае Прочитать() тут роли не играет. (8) Данный параметр мне не нужен, у меня не может быть неуникального набора измерений, это все анализируется ещё в момент формирования ТЗ, которую потом в регистр пишу. (9) А у нас файл БД меньше 4Гб, так что размер одного регистра тем более не критичен в этом плане. В чем же косяк тогда ... |
|||
11
ASU_Diamond
06.07.10
✎
16:09
|
(10) сначала записываешь в один регистр, потом переносишь записи в другой и заного заносишь в первый?
|
|||
12
ASU_Diamond
06.07.10
✎
16:11
|
по 10к записей пробовал записывать?
|
|||
13
Антиквар
06.07.10
✎
20:48
|
(11) Нет, переношу в архив. Да какая разница, это не суть. Ошибка при записи в конкретный регистр после 300 тыщ строк. Я специально ставил многоточие, там куча кода, не связанного с проблемой, поверьте.
(12) По 10 тыщ не пробовал. Но какая разница, допустим я уточню, что могу записать 320 тыщ, а 330 уже не смогу, проблема то останется. |
|||
14
ho0p
06.07.10
✎
21:13
|
(0) Может попробовать на другом компьютере с другими параметрами..
|
|||
15
Fragster
гуру
06.07.10
✎
21:21
|
у нас тут недавно 1 700 000 записей через автообмен пролезало (месяц перепровели) - вот это была жесть...
|
|||
16
woody woodpecker
06.07.10
✎
21:21
|
а как можно в файловой версии посмотреть размер таблиц? Есть база с планами обменами, так там по 300 МБ добавляется после каждого нового плана обмена. База под 3,5 ГБ, я так предполагаю, что основную лепту вносит регистр соответсвия объектов. Как посмотреть его размер и вообще оценить, не подходит ли он к ограничению?
|
|||
17
acsent
06.07.10
✎
22:00
|
Зачем транзакции? Это вам не 77
|
|||
18
hhhh
06.07.10
✎
22:56
|
(13) если набор записей у тебя, то должен быть отбор. Так как отбора нет, то он первым делом у тебя удаляет из регистра 300000 записей, где-то их хранит, а потом добавляет 350000 записей. Без отбора набор записей оперирует с целым регистром.
|
|||
19
EvgeniuXP
07.07.10
✎
00:10
|
а если перед записью сначала сжать базу, а потом только записать 500 000 строк не удаляя ничего... возможно, что удалив, база-то всё-равно распухла... а лучше в тех.поддержку 1С написать... правда, долго ответа ждать...
|
|||
20
Живой Ископаемый
07.07.10
✎
00:19
|
2(10) какого размера строки, чтобы посчитать примерный объем... а также какие индексы есть - чтобы прикинуть размер индексного файла
|
|||
21
Антиквар
07.07.10
✎
09:49
|
(14) Это сервер, загрузка и обработка данных идет около суток :) Остальные компы слабые очень чтоб такое пробовать :)
(17) Сначала было и без транзакций. Транзакции добавлены для того, чтобы была гарантия, что блок данных физически записался на диск. Т.к. думалось по-началу, что просто большой блок записать памяти не хватает. (18) Как это отбора нет. Сложно его не заметить в маленьком куске кода :) Регистр = РегистрыСведений.Тратата.СоздатьНаборЗаписей(); Регистр.Отбор.Поле1.Значение = ...; Регистр.Отбор.Поле1.Использование=Истина; (19) Дак размер базы не критичен ещё. Меньше двух гигов весь файл базы данных. В серьезных вопросах тех.поддержка ещё ни разу не помогла. А вот на форуме много и знающих, и опытных, шансов больше :) |
|||
22
Антиквар
07.07.10
✎
10:07
|
(20) Структруа регистра:
ПериодичностьРегистраСведений: "Непериодический" РежимЗаписи: "Независимый" ОсновнойОтборПоПериоду: "Ложь" ПолнотекстовыйПоиск: "НеИспользовать" - Измерение1: Тип:"СправочникСсылка.Справочник1" Ведущее: "Истина" ОсновнойОтбор: "Истина" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Измерение2: Тип:"СправочникСсылка.Производители" Ведущее: "Ложь" ОсновнойОтбор: "Истина" Индексирование: "Индексировать" ПолнотекстовыйПоиск: "Использовать" - Измерение3: Тип:"Строка(40, Переменная)" Ведущее: "Ложь" ОсновнойОтбор: "Истина" Индексирование: "Индексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс1: Тип:"Строка(200, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс2: Тип:"Строка(50, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс3: Тип:"Число(12, 2)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс4: Тип:"Число(12, 2)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс5: Тип:"Число(12, 2)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс6: Тип:"Строка(10, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс7: Тип:"Булево" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс8: Тип:"Строка(50, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс9: Тип:"Строка(0, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс10: Тип:"Строка(0, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс11: Тип:"Строка(0, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс12: Тип:"Строка(0, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс13: Тип:"Строка(0, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс14: Тип:"СправочникСсылка.Контрагенты" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" - Ресурс15: Тип:"Строка(50, Переменная)" Индексирование: "НеИндексировать" ПолнотекстовыйПоиск: "Использовать" |
|||
23
Just4Fun
07.07.10
✎
10:16
|
(0) если целью является создание подобия обычной таблицы, и заведомо, что она будет содержать большое количество записей, то лучше создать регистр накопления без ресурсов. при этом, для сравнения, запись порядка 50 тысяч записей в РС длится порядка 20 минут, а в РН - 30 секунд.
|
|||
24
sash-ml
07.07.10
✎
10:22
|
Кроме перехода на СКЛ ничего не поможет. Ограничение на размер одной таблицы в файловом варианте около 2гб. Связано с адресацией физического пространства :(
Как вариант удалять старые ненужные записи из этого регистра |
|||
25
hhhh
07.07.10
✎
10:42
|
(21) какая разница, если у тебя в результате отбора остается 300000 записей, всё равно будет ситуация как в (18). Делай более конкретный отбор, по нескольким измерениям.
|
|||
26
nbIx
07.07.10
✎
10:54
|
(23) А регистратор?
|
|||
27
Антиквар
07.07.10
✎
11:07
|
(23) Регистр накопления конечно не совсем в тему, надо подумать. Только вот регистратор придется делать. Да и если все ресурсы перенести в измерения, то какая каша получится, теоретически станет возможна запись неуникальных записей... Короче переделок ужас сколько.
(24) Вот я и думаю, что только SQL (25) у меня загрузка по одному измерению, т.е. отбор только по нему может быть. Мне и надо, чтобы в случае перезаписи все прежние записи удалились. А в случае добавления, просто добавлялись. Хочешь сказать, что после: Регистр = РегистрыСведений.Тратата.СоздатьНаборЗаписей(); Регистр.Отбор.Поле1.Значение = ...; Регистр.Отбор.Поле1.Использование=Истина; Регистр.Прочитать(); "первым делом у тебя удаляет из регистра 300000 записей, где-то их хранит, а потом добавляет 350000 записей" ??? |
|||
28
hhhh
07.07.10
✎
11:24
|
(37) ну да. Команда Регистр.Прочитать() считывает 300000 записей в память. Команда Записать(); записывает 350000 записей из памяти в базу. Перед этим естественно трет в базе то, что по этому отбору было.
Попробуй не делать Прочитать() - выбросить эту строчку, зато в конце поставь Записать(Ложь); - в режиме добавления записей. Может прокатит. |
|||
29
Живой Ископаемый
07.07.10
✎
12:33
|
2(22) вполне возможно что при такой струкутуре - я вижу что есть строки неограниченной длины, да и фиксированной длины - 360 сивмолов... вполне возможно что твои 300 тысяч записей догоняют размер файла, в котором хранится РС до (24)... Опять же, если после добавления 300 тыс. записей размер самого файла 1Св8.1СД более 2 Гб, то это уже звоночек... и тогда тока переорганизация регистра или переход на клиент-серверную версию может тебе помочь...
|
|||
30
Антиквар
07.07.10
✎
13:06
|
(28) понял мысль, надо подумать. Прочитать() у меня там для другого делается, получится ли без этого... Спасибо
(29) В том то и дело, что может помочь, а может и не помочь :) Я уверен, что поможет, но вдруг нет, с клиентом не хорошо получится. |
|||
31
sash-ml
07.07.10
✎
13:11
|
а если попробовать файловую ситему поменять с НТФС на НТФС но покруче или размер кластера поменять, идея бредовая канешно но кто его знает.....
|
|||
32
acsent
07.07.10
✎
13:13
|
Делай через менеджер записи без транзакций
|
|||
33
Михаил Козлов
07.07.10
✎
13:15
|
Может быть имеет смысл ограничить строки неограниченной длины?
|
|||
34
Антиквар
07.07.10
✎
16:38
|
(31) я не админю сервак, и доступа к нему не имею. Удаленно только по 1С. Но посоветовать могу :)
(32)Раньше и было без транзакций. Транзакции я уж потом добавил, чтобы блоками физически на винт писать. (33) Строки бывают очень большие. Даже не знаю сколько символов оставить чтоб инфу не обрезать. Но поэкспериментировать с этим можно, чтобы хоть причину найти, если она в этом конечно. |
|||
35
acsent
07.07.10
✎
16:44
|
(34) транзакция <> физически на винт
|
|||
36
Живой Ископаемый
07.07.10
✎
16:47
|
2(34)
http://gilev.blogspot.com/2010/06/1c.html "? файл базы данных (.1CD) внутри организован как множество так называемых внутренних файлов. Каждой из таблиц базы данных соответствует до 4-х внутренних файлов: ? файл описания таблицы. В данном файле находится описание таблицы. ? файл записей данных. В этом файле находятся данные всех записей таблицы за исключением данных, содержащихся в полях неограниченной длины. ? файл индексов. В этом файле размещаются все индексы определенные для таблицы. Если не определено ни одного индекса, то этот файл отсутствует. ? файл значений неограниченной длины. В этом файле хранятся значения неограниченной длины, содержащиеся в полях таблицы. ? размер каждого из вышеперечисленных внутренних файлов не может превышать 4 Гбайт. ? длина ключа в индексе не может превышать 1920 байт." |
|||
37
nbIx
07.07.10
✎
17:43
|
(0) Мне кажется что структура РС хреновата, особо смущают строки неограниченной длины.
|
|||
38
Hmster
07.07.10
✎
17:57
|
(34) без транзакций пробовал таким способом:
а не пробовал? Запись=РегистрыСведений.Регистр.СоздатьМенеджерЗаписи(); Запись. ...=...; Запись. ...=...; Запись.Записать(); ? |
|||
39
Антиквар
07.07.10
✎
22:07
|
(35) ну я понимаю, но я к тому, что 1С из своей памяти выгрузила
(36) спасибо. Значит проблема не в размере. (37) строки в самом деле неограниченной длины в источнике :) (38) вроде нет. Это чем-то лучше ? |
|||
40
Живой Ископаемый
07.07.10
✎
22:09
|
2(39) "Значит проблема не в размере." - прошу прощения, пропустил как вы пришли к такому выводу?
|
|||
41
Живой Ископаемый
07.07.10
✎
22:16
|
а, понял, на основании (10).
Но опять же - это в том случае если НТФС а не фат32 |
|||
42
TeddySlaf
07.07.10
✎
23:08
|
может не в тему, но "Регистр" не зарезервированное слово в 8-ке? в 7-ке - да.
|
|||
43
Антиквар
08.07.10
✎
08:36
|
(41) Да, на основании того, что весь файл БД не более 2 гигов.
Про файловую систему не в курсе, надо узнавать. Но на сервере думаю НТФС. (42) Регистр - это я в коде просто заменил настоящее название, чтоб лучше читалось :) |
|||
44
Serg_1960
08.07.10
✎
09:22
|
(может и бред скажу) Я бы все ресурсы регистра в справочник скинул, а в самом регистре - всего один ресурс (ссылка на запись справочника). Зачем и почему? Ну не нравится мне эти "Тип: Строка(0, Переменная)" и всё тут :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |