kms писал(а) 19. Октября 2007 :: 17:26:По падениям: поставь лимит побольше, у меня гарантированно падает на 4 млн. строк.
bad_alloc, в фазе выгрузки в таблицу
+
наверное, дело не в компоненте
видимо, это стандартная тз так себя ведет, прожорливая тля
Ты прав
Да падает. Но падает именно стандартная таблица значений.
sqlite работает
Вот тест
имя = ":memory:";
Попытка
база = СоздатьОбъект("SQLiteBase");
Исключение
//ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
ЗагрузитьВнешнююКомпоненту("c:\1cpp_test\"+"1sqlite.dll");
база = СоздатьОбъект("SQLiteBase");
КонецПопытки;
_mt =СоздатьОбъект("Math");
_mt.SRAND(_GetPerformanceCounter());
база.Открыть(имя);
запрос = база.НовыйЗапрос();
запрос.ВыполнитьЗапрос("create table test(cnt int)");
т1 = _GetPerformanceCounter();
запрос.ВыполнитьЗапрос("begin transaction");
запрос.Подготовить("insert into test values(?)");
Для Номер = 1 По __лим Цикл
_знач =Окр(_mt.RAND1() * __лим);
запрос.УстановитьПараметр(1, _знач);
запрос.Выполнить();
КонецЦикла;
запрос.ВыполнитьЗапрос("commit transaction");
т2 = _GetPerformanceCounter();
запрос.ВыполнитьЗапрос("create index i_cnt on test(cnt)");
т3 = _GetPerformanceCounter();
// тз = запрос.ВыполнитьЗапрос("select cnt from test order by cnt");
тз = запрос.ВыполнитьЗапрос("select count(*) from test");
т4 = _GetPerformanceCounter();
Сообщить("Вставка = " + (т2 - т1) + " Индексация = " + (т3 - т2) + " Выборка = " + (т4 - т3));
Сообщить("Строк = " + тз.КоличествоСтрок());
сообщить("В sqlite строк = " + тз.ПолучитьЗначение(1,1));
тз.ВыбратьСтроку();
Результат выполнения этого кода ( при этом комп был загружен и другими задачами )
Тест SQLITE
Вставка = 80684 Индексация = 47814 Выборка = 326
Строк = 1
В sqlite строк = 5000000
Тест SQLITE
Вставка = 161190 Индексация = 115840 Выборка = 656
Строк = 1
В sqlite строк = 10000000
Тест SQLITE
Вставка = 243605 Индексация = 188293 Выборка = 981
Строк = 1
В sqlite строк = 15000000
Т.е sqlite обработала 15 миллионов строк.
Время вставки и выборки линейное.