Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Загрузка записей из таблицы БД


Страницы:   1 2

js2 ©   (2009-04-23 15:31:00) 

имеется постоянно корректируемая таблица БД (записей от 2 000 000 до 6 000 000). Задача состоит в том чтобы грузить все записи или в список или в массив. Что посоветуете:

1. Написать наследник Tlist который будет работать с record
2. Грузить в массив типа record

Какие плюсы\минусы этих вариантов?


Игорь Шевченко   (2009-04-23 18:49:00) [1]


> программе все одно выделится 2 гига...  


меньше


Anatoly Podgoretsky   (2009-04-23 18:46:00) [2]

> Ega23  (23.04.2009 17:18:33)  [33]

Во первых только 2 гб. во вторых как писать, например через StringGrid


sniknik   (2009-04-23 18:17:00) [3]

> Не, ну если памяти 3 гига
программе все одно выделится 2 гига...  так вроде?


Ega23   (2009-04-23 17:18:00) [4]


> нифига ему памяти не хватит.


Не, ну если памяти 3 гига, структура таблицы (id int, name varchar(10)), то хватит...  :)


sniknik   (2009-04-23 17:05:00) [5]

> Он уже в тех пяти байтах. счетчик ссылок + нулевой
упс. а счетчик ссылок то я и не учел... а нулевой то да, это я там расписал эти 5 байт как я их понимаю.
тогда еще + 4 байта (ну или они как то совмещают и считают длину строи от длинны блока памяти, тогда остается как есть)

блин, нужно бы кого нибудь кто в этой "кухне" хорошо разбирается, а то все смутно как то и не уверенно...

-----------------
- дети, давайте позовем того без кого не обходится ни один новый год.
- милиция!!!!

т.е. нет Юрий Зотов, Юра!!! а ууу!!! ;о))


Anatoly Podgoretsky   (2009-04-23 17:00:00) [6]

> Ega23  (23.04.2009 16:45:30)  [30]

Наконец шаги навстречу друг другу и вывод, нифига ему памяти не хватит.


Ega23   (2009-04-23 16:45:00) [7]


> Но все равно добавь 4 байта на указатель, если конечно это
> не будет реализовано через массив.


Так я же и говорил - это просто по минимуму, дальше некуда. Если по-хорошему надо делать - то да, на простейшую структуру места гораздо больше будет отводиться. Ну и на 6 лимонов помножить..  :)


Anatoly Podgoretsky   (2009-04-23 16:45:00) [8]


> Это, естественно, при String[255]

String[10] или 5, мы про эти две длины говори.


Anatoly Podgoretsky   (2009-04-23 16:41:00) [9]

> Ega23  (23.04.2009 16:34:23)  [23]

Не хочешь мне пойти навстречу :-)
Ты уверен что автор так сможет написать, а не так как я говорю?
Но все равно добавь 4 байта на указатель, если конечно это не будет реализовано через массив.


Медвежонок Пятачок   (2009-04-23 16:39:00) [10]

и 1 байт на завершение #0 -ем

Он уже в тех пяти байтах. счетчик ссылок + нулевой


Anatoly Podgoretsky   (2009-04-23 16:38:00) [11]

> sniknik  (23.04.2009 16:33:22)  [22]

Правильно про завершающий байт я забыл и я еще не уверен за системную часть, раньше невидимая часть составляла 12 а не 8 байт, сейчас один показатель убрали из объявления.


Anatoly Podgoretsky   (2009-04-23 16:36:00) [12]

> Медвежонок Пятачок  (23.04.2009 16:29:21)  [21]

Будет потрачено 5 на строку + 4 байта на переменную и + 8 байт на скрытую часть строки, то есть к каждой строке добавлять 12 байт накладных расходов.


Ega23   (2009-04-23 16:35:00) [13]

Это, естественно, при String[255]


Ega23   (2009-04-23 16:34:00) [14]


> Ты сделай нормальное объявление
>
> NameChars: string


Да нафига мне оно надо? Я же не стринг храню.

procedure StreamAddRecord(stream : TStream; const id : Integer; const aStr : shortstring);
var
 strLen : Byte;
begin
 stream.WriteBuffer(id, 4);
 strLen := aStr[0];
 stream.WriteBuffer(strLen, 1);
 stream.WriteBuffer(PAnsiChar(aStr[1])^, strLen);
end;


Что-то в таком духе. Писал прямо сдесь, возможны косяки.


sniknik   (2009-04-23 16:33:00) [15]

> 15
реально больше
> length of Str + 5 bytes.
это собственно под данные строки, т.е. еще 4 байта под префикс (где находится длинна строки), и 1 байт на завершение #0 -ем, на случай приведения типа к PChar.
но тут не учитывается размер самой переменной, т.е. указателя на эти данные, + при выделении блока памяти там тоже есть служебные данные (та же длинна но уже блока, + как то они там в цепочку организуются. не помню точно...)

т.е. я бы сказал даже не 22, а 23 байта нужно... имхо. + есть еще и выравнивание блоков по границе 8(? 16) байт. опять смутно все... ;(


Медвежонок Пятачок   (2009-04-23 16:29:00) [16]

Я к тому, что если

s : string;
begin
s:= 'мама';
end;

то на s будет потрачено 4 + 5 байт. даже если не было ни стрнью ни страллок.


Anatoly Podgoretsky   (2009-04-23 16:26:00) [17]

Это не string, а уродец из Си к тому же backward compatibility routines и все равно добавь еще 4 байта для хранения указателя. Это же PChar


Медвежонок Пятачок   (2009-04-23 16:22:00) [18]

Name при размере 10 символов для строк займет минимум 22 байта, плюс расходы на поддержку списка

15

StrNew allocates a copy of Str on the heap.
.....
The allocated space is the length of Str + 5 bytes.


Anatoly Podgoretsky   (2009-04-23 16:19:00) [19]

> Ega23  (23.04.2009 16:16:17)  [17]

Ты сделай нормальное объявление

NameChars: string


Ega23   (2009-04-23 16:16:00) [20]


> для строк займет минимум 22 байта


Почему?
Если считать, что строка не больше 255 символов, то запись будет выглядеть
id - 4 байта
NameSize - byte
NameChars - буфер символов.
И всё это одной цепочкой пустить.
Навигация, правда, будет просто никакая.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо