Имя: Пароль:
1C
 
Ограничение кол-ва записей в регистре сведений
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, Переменная)" и всё тут :)