Форум: "Базы";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];
ВнизВопрос об ограничении размерa БД. Найти похожие ветки
← →
Duke2 (2002-12-22 22:08) [0]Вопрос об ограничении размерa БД.
Уважаемые мастера !
Пытаюсь создать пустую матрицу, в которой хранится рассчитанный расход
для 50 потребителей 20 видов энергоносителей за весь год - 365 дней.
Так вот, при создании этой матрицы ( То бишь при наполнении таблицы
dbf пустыми записями), приблизительно на 33000 -ой записи, происходит
ошибка "EDBEngineError - Read failure". Файл dbf при этом занимает
немного - 3,5 Мб. Почему это происходит ? Неужели В DELPHI !! DBF !!!
НЕ МОЖЕТ !!!! ИМЕТЬ !!!!! БОЛЬШЕ 35000 ЗАПИСЕЙ !!!!!!
Обратите внимание. После добавления каждых 1000 записей я делаю
закрыть-открыть, чтобы сбросить буфер на диск (Никакие FlashBuffers
сколько бы в этой конференции ни говорили - не работает ни в Dbase
ни в Paradox), таким образом переполнения памяти не должно быть.
(И не сбрасывать я тоже пробывал)
Машина P4-128Mb, Win98, D4, таблица открыта в монопольном режиме.
Просьба не советовать использовать Paradox а также IB.
И еще. Че так медленно он добавляет записи ? 35000 записи за 4 мин !!!
Даже Clipper на 386-33Mhz это делает секунд за 20.
dd:=StrToDate("01.01.2002");
g:=2002;
while g=2002 do begin
for x:=1 to 50 do begin
for y:=1 to 20 do begin
Application.ProcessMessages;
Table1.Append;
Table1.FieldByName("dat").asDateTime:=dd;
Table1.Post;
end;
end;
dd:=IncDay(dd,1);
DecodeDate(dd,g,m,d);
Table1.Active:=false; Table1.Active:=true;
end;
showmessage("создание матрицы завершено !");
← →
sniknik (2002-12-22 22:33) [1]насчет скорости выкинь за пределы цикла (хотя бы первого)
Application.ProcessMessages; и Table1.Post;
(вызов системы и перезапись таблици после одного изменения это как то слишком)
и FieldByName("dat") замени на аналогичное Fields[0].
точно будет быстрей.
и 35000 точно мало и в 10 раз больше прилично работает.
← →
Duke2 (2002-12-22 22:48) [2]Во блин ! А я и не знал что можно делать Post
не после каждого Append или Edit !
Век живи-век учись...
← →
sniknik (2002-12-23 00:22) [3]Можно вообще без него, просто нет гарантий на сохранность записываемых данных, но быстрей.
к примеру (по аналогии к твоей, структура 2 поля дата и чар(50))
var TimeBefore, CurrentDay: TDateTime;
i, n: integer;
st: string;
begin
DMod.Table1.Close;
DMod.Table1.DatabaseName:= "D:\";
DMod.Table1.TableName:= "DATYEAR.DBF";
DMod.Table1.Open;
CurrentDay:=StrToDate("01.01.2002");
n:= 1;
TimeBefore:= Now;
while YearOf(CurrentDay)=2002 do begin
st:= "Типа название фирмы " + IntToStr(n);
for i:= 1000 downto 1 do begin
DMod.Table1.Append;
DMod.Table1.Fields[0].asDateTime:= CurrentDay;
DMod.Table1.Fields[1].AsString:= st;
end;
CurrentDay:= IncDay(CurrentDay, 1);
Inc(n);
//DMod.Table1.Post;
end;
DMod.Table1.Close;
showmessage("создание матрицы завершено ! за : " + TimeToStr(Now-TimeBefore));
end;
выполняется (у меня) 4 сек. при раскомментареном DMod.Table1.Post; 7 сек. разница!
← →
Duke2 (2002-12-23 08:39) [4]Спасибо ! По поводу быстродействия сегодня я узнал много нового !
Однако, всеж почему мой текст затыкается на 33000 записи ?... Что мешает плохому программисту ?
← →
Johnmen (2002-12-23 09:29) [5]>Во блин ! А я и не знал что можно делать Post
>не после каждого Append или Edit !
Можно то можно, только он все равно выполняется неявно перед каждым Append"ом (в данном случае).
А существенно ускорить можно, используя напрямую запрос INSERT INTO ... с параметром.
← →
sniknik (2002-12-23 12:25) [6]вряд ли "INSERT INTO " поможет (в этом контексте), вот если бы данные уже гдето были, то тогда да за счет обработки данных групой, а так когда каждая запись создается на ходу ... не получится ускорения.
чуть-чуть еще ускорить можно заменив
DMod.Table1.Append;
DMod.Table1.Fields[0].asDateTime:= CurrentDay;
DMod.Table1.Fields[1].AsString:= st;
на обшее
DMod.Table1.AppendRecord([CurrentDay, st]);
но это по моему все, финиш, в делах ускорения.
Duke2 (23.12.02 08:39)
> почему мой текст затыкается на 33000 записи ?
чегото ему не хватает :-), это конечно не ответ но почему это тебе выяснять, у меня отрабатывает и такой (может от машины/BDE и т.д. зависит). и к стати не так уж и долго работает ~ сек 20 а не 4мин хотя машина Атлон 1300 (~3 пень а не 4 как у тебя).
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c