Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];

Вниз

Как динамичный массив   Найти похожие ветки 

 
Zorik   (2003-08-11 12:43) [0]

Помогите! Мне нужно "засунуть" набор данных (динамичный массив) в поле типа blob в проге а потом эти дание оттуда извлечь.


 
Desdechado   (2003-08-11 13:02) [1]

может, без таких извратов можно обойтись?
засунь в таблицу со структурой, как в массиве, потом доставай на здоровье...
если же хочешь поизвращаться, то копай в сторону преобразования чисел (или что у тебя там) в PChar, не забудь сохранять тип и т.д.


 
Zorik   (2003-08-11 14:30) [2]

<<то копай в сторону преобразования чисел (или что у тебя там) в PChar, не забудь сохранять тип и т.д.

А как это на практике сделать?


 
Nikolay M.   (2003-08-11 14:43) [3]

TBlobStream.Read(Write) ?


 
Zorik   (2003-08-11 15:05) [4]

Подскажите как сформировать этот буфер для записи а потом чтения, потому что я раньше ничего подобного не делал.


 
Desdechado   (2003-08-11 15:26) [5]

например, "I"+ 4байта 16-го представления Integer + "C" + длина строки + сама строка ...
ну, и парсер ко всему этому
а вообще попробуй все-таки в таблицу нормально - меньше геморроя и все прозрачно


 
Zorik   (2003-08-11 15:46) [6]

спасибо, может разберусь. Но гемороя не меньше. У меня сейчас так и есть. Проблема в том что даных много. Из миллиона записей (всего в таблице) нужно выбирать по 20-40 тысяч. Тип таблицы такой
table Graf_points (code_diagr integer, x float, y float)
оттуда надо выбрать данные по полю code_diagr. Прикол в том что данные не изменяются (один раз записываются а потом только экспортуются). Я думал что так прога будет работать быстрее и в таблице не будет космическое число записей.
Может кто знает другое решение- подскажите.


 
Desdechado   (2003-08-12 12:15) [7]

миллион записей - это скромно
20-40 тыс тащить на клиента - это уже тормоза. Если упаковать в блоб, траффик мудет _немного_ меньше, но зато тормоза будут при распаковке


 
Zorik   (2003-08-12 12:26) [8]

скажите как упаковать в блоб, желательно с примером. хочу проверить трафик сам. для меня он не столь важен а важно то что база начинает глючить.


 
Zorik   (2003-08-12 12:55) [9]

Спасибо. Разобрался. Статистические данные приведу позже.


 
Zorik   (2003-08-12 17:48) [10]

Информация для скептиков
насчет трафика и тормозов машины
Pentium II 700MHz 128 MB RAM

количество | время записи | время считывания
точек | в БД | с БД плюс распаковка
| | плюс отображение на TChart
___________|________________|____________________________
100 | 00:00:010 | 00:00:000
1 000 | 00:00:032 | 00:00:010
10 000 | 00:00:460 | 00:00:080
50 000 | 00:04:206 | 00:00:410
100 000 | 00:06:970 | 00:01:032
200 00 | 00:13:310 | 00:02:543
_________________________________________________________

Ну как?


 
Zorik   (2003-08-12 17:55) [11]

в таблице минуты:секунды:милисекунды


 
Johnmen   (2003-08-12 17:56) [12]

При этом для каждого количества, надеюсь, было получено в индивидуальном соединении ?
А еще лучше, с перезагрузкой.


 
Desdechado   (2003-08-12 18:04) [13]

а теперь чтение-запись без упаковки - для сравнения


 
Zorik   (2003-08-12 18:15) [14]

Соединение не разрывалось. Все исполнялось в рамках одного соединения одной транзакции и таблица все время была активной. Точно нарисовать такую же таблицу немогу но для приблизительно 2000 точек с применением компонента BatchMove около 3 секунд


 
Desdechado   (2003-08-12 19:48) [15]

1. ну, если не разрывал соединение, то БД постепенно кэшировалась сервером, поэтому результаты почти отфонарные
2. причем, если ты говоришь, что записанные записи не меняются, то зачем скорость записи мерять? Измеряй чтение...
3. какие компоненты используешь?


 
Zorik   (2003-08-13 09:50) [16]

Я извиняюсь, но я же помню как раньше было. 1 вариант: записи вставляются в цикле, типа

with IBQuery1 do
begin
for i:=0 to n-1 do
begin
Append;
CodeGraph.Value:=Code;
CodeLine.Value:=Line;
X.Value:=X;
Y.Value:=Y;
end;
ApplyUpdates;
IBTransaction.CommitRetaining;
end;

это самый медленный.
2 вариант: использование BatchMove. Но эта штука есть только в BDE. FibPlus еще не купили (только демо). Сначала работает быстро, но потом глючит.
3 вариант: смотри выше.

А тепер посудите: если, например, 5 пользователей одновременно кидают в базу каждый, например, по 20 000 - 40 000 записей, какова вероятность ошибки DeadLock? А тепер про чтение. Нужно выбрать приблизительно из миллиона записей по 20 000 - 40 000 записей по двум полям (CodeGraph.Value=Code; CodeLine.Value=Line) отсортировать по Y (где гарантия того что в БД они расположены по порядку). Это в SQL-запросе конечно. Потом пробежатся по этим записям и сформировать массив. А его уже отображать в виде графика. Стандартные средства отображения с таблицы, запроса не подходят, так как есть свои ньюансы как должен выглядеть график.
И не упрекайте меня. У меня есть реальные результаты. Если знаете иной вариант - скажите
Насчет скорости записи. Бывало что линия закидывалась более 20 минут.


 
Johnmen   (2003-08-13 09:59) [17]

В последнем посте виден только один вопрос...:)
Ответ : вероятность ошибки DeadLock = 0.


 
Zacho   (2003-08-13 10:39) [18]


> Zorik © (13.08.03 09:50) [16]
>
> with IBQuery1 do
> begin
> for i:=0 to n-1 do
> begin
> Append;
> CodeGraph.Value:=Code;
> CodeLine.Value:=Line;
> X.Value:=X;
> Y.Value:=Y;
> end;
> ApplyUpdates;
> IBTransaction.CommitRetaining;
> end;

Естественно, медленный. Вместо TIBQuery возьми TIBSQL, и делай Commit (а не CommitRetaining) после вставки каждых 100000 записей. Еще перед этим циклом желательно сделать Prepare.

> отсортировать по Y (где гарантия того что в БД они расположены
> по порядку)

А какая разница, как они расположены в БД ? Создай индекс по нужному полю. Правда, индекс замедлит вставку записей, но перед массовой вставкой индекс можно и отключить, а после вставки - активировать.


 
Zorik   (2003-08-13 11:22) [19]

Конечно, можно все грамотно сделать. Можно даже кнопочку вывести Commit. Но попробуйте обьяснить пользователю что такое коммит и как ним пользоватся. И связь с сервером не очень-то надежная, а при разрыве все записи до коммит утрачиваются (FibPlus или еще что-то не использую). Пользователь хочет реально видеть то что он записал и быть уверенным что завтра ето тоже там будет. Перечитывать даные вручную они не очень хотят - нужно все рефреши делать автоматическими, а это сложно все продумать (типа закладки в таблицах, поиск по индексу и т. д.) Варианты аля бухгалтерских БД не принимаются.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
14-10891
pasha_golub
2003-08-15 22:18
2003.09.04
И тут Остапа понесло...


14-10881
Anatoly Podgoretsky
2003-08-04 16:30
2003.09.04
Вечный вопрос


1-10675
VladimirES
2003-08-21 12:33
2003.09.04
Клиент/сервер приложение на СОМ/DCOM (общие вопросы)


7-11002
S.P.I.R.I.T.
2003-06-18 13:57
2003.09.04
Приложение которое не минизируется.


3-10606
Malyatko
2003-08-13 17:07
2003.09.04
Подключение к базе данных.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский