Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.009 c
14-49225
Uran
2002-12-26 08:57
2003.01.16
Работа со сканером


14-49209
Катерина
2002-12-28 12:58
2003.01.16
С Новым годом!


1-48982
mate
2003-01-06 15:02
2003.01.16
Word и Delphi


4-49367
Serbor
2002-12-01 17:55
2003.01.16
Дата и время


3-48916
oss
2002-12-20 10:32
2003.01.16
ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский