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

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

Сколько байт достаточно для хранения длины строки?


Страницы:   1 2 3

AlexanderMS ©   (2007-11-05 06:49:00) 

В моём случае длина каждой строки редко переваливает даже за 255. В файл записываю по привычке (плохая привычка, ИМХО), её длину в 4 байта ( integer). Тут пришла мысль, что нерационально использую дисковое пространство, и подумал ограничиться двумя байтами ( word). Но вспомнил, что компьютер работает с регистрами в 4 байта, и возник вопрос: как это скажется на времени выполнения всей процедуры чтения? Строк в файле может быть достаточно много.

Попутный вопрос: почему свойста Countу везде Integer(а не cardinal/dword), хотя количество элементов не может быть отрицательным?


Riply   (2007-11-05 16:24:00) [1]

>[42] sniknik ©   (05.11.07 16:04)
> только она, имхо, не подходит под условие в вопросе. (рациональности размещения строк)

Это только способ. Не обязательно его копировать один-в-один.
Я там написала: "Ну это надо подогнать под свои нужды."


Riply   (2007-11-05 16:19:00) [2]

> [46] Riply ©   (05.11.07 16:14)
Опечатка:
заголовок займет не 33, а 17 Byte.


Riply   (2007-11-05 16:14:00) [3]

> [40] sniknik ©   (05.11.07 16:01)
> что в сумме с описательным байтом самих смещения и длинны будет 3 байта, и хоть удавись, а дальше в меньше не уложишься.
Мне кажется, что запихать в три байта и смещение и длинну, довольно неплохо :)
А если все совсем астрономическое, то заголовок займет SizeOf(Byte) + SizeOf(Int64) + SizeOf(Int64) = 33 Byte.
Тоже не очень плохо для описания почти Int64 объектов размером в Int64 :)
Хотя эта структура позволяет оперировать и почти Int128 объектов размером в Int128 :)
Его плюс в том, что он "дышит".
Когда с этим вдоволь поковыряешся, то начинаешь думать: "как все продуманно и грамотно сделано".
Во всяком случае со мной было так :)

P.S.
Я никого ни за что не агитирую.
Просто рассказала, как подобную задачу решили ребята из Microsoft`а.


sniknik   (2007-11-05 16:08:00) [4]

> Легко решается записью строк в столбик, по вертикали ;)
зачем решать если она не нужна? тут решается как раз противоположное.


sniknik   (2007-11-05 16:06:00) [5]

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


KilkennyCat   (2007-11-05 16:04:00) [6]


> sniknik ©   (05.11.07 16:01) [40]
>  произвольная адресация

Легко решается записью строк в столбик, по вертикали ;)


sniknik   (2007-11-05 16:04:00) [7]

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


KilkennyCat   (2007-11-05 16:01:00) [8]


> Anatoly Podgoretsky ©   (05.11.07 15:58) [39]
> ...они же свихнутся.


Они на этом форуме. Значит, уже ;)


sniknik   (2007-11-05 16:01:00) [9]

> не совсем верно :)
я в основном про смещение, оно как видно уже на втором шаге может перевалить байт и стать 2 мя (или не на втором но очень очень быстро), что в сумме с описательным байтом самих смещения и длинны будет 3 байта, и хоть удавись, а дальше в меньше не уложишься.
если же первая строка не 256, а поменьше, например 1 байт, то 1+1+1 - описатель + смешение + длинна, и тоже очень быстро сумма переваливает 256 и на смешение нужно уже 2 байта. (3 прям магическое число)
не говоря уж о том когда размер действительно "подрастет" до использования int128 в смещении...

1 байт вначале, и редкие 2 случайных в том же начале (до 256) это не "не совсем верно" это "в основном верно. но есть не играющие роли исключения".

а тот же линуксовый текст всегда на одну строку 1 байт. читать правдя всегда придется только сначала, не адресно, но по задаче вроде произвольная адресация и не стоит.


Anatoly Podgoretsky   (2007-11-05 15:58:00) [10]

> Riply  (05.11.2007 14:58:22)  [22]

Ты куда их гонишь, они же свихнутся.


Anatoly Podgoretsky   (2007-11-05 15:58:00) [11]

> ProgRAMmer Dimonych  (05.11.2007 14:29:20)  [20]

Зачем говорить о строках, когда речь идет об двоичных файлах.


Riply   (2007-11-05 15:44:00) [12]

> [34] sniknik ©   (05.11.07 15:38)
> ага, 1 раз, в начале структуры с нулевой длинной.

И в середине может быть нулевой элемент.
Соответственно и
> и чем дальше тем больше будет размер заголовка. на второй строке первая 256 байт это уже 1+2+1(/0)
не совсем верно :)


Riply   (2007-11-05 15:40:00) [13]

> [33] homm ©   (05.11.07 15:37)
> А не int128 ? :)

И его тоже :)
Но есть различные "выкрутасы" с этими полями.
В них (выкрутасах) игра может строиться и на том,
что первые два поля рассматриваются, как знаковые.
В этом случае int128 не поместиться :)


KilkennyCat   (2007-11-05 15:39:00) [14]


> sniknik ©   (05.11.07 15:30) [29]
> архивы думаю не рассматриваются...


Нет, не архивы... что-то близко к кодированию передачи данных. То есть, раскладываем весь файл побитно, и кодируем, например, каждые 16 бит. Хоть это  близко к архивам но не совсем..., и скорость кодирования и декодирования очень высокая.


sniknik   (2007-11-05 15:38:00) [15]

> Минимальная структура - 1 байт :)
ага, 1 раз, в начале структуры с нулевой длинной.
и чем дальше тем больше будет размер заголовка. на второй строке первая 256 байт это уже 1+2+1(/0)
и т.д.
1 и даже 3 байта в заголовке = исчезающе малая величина.


homm   (2007-11-05 15:37:00) [16]

> [31] Riply ©   (05.11.07 15:32)
> Ты невнимательно посмотрел структуру. DataOffset может содержать
> и Int64

А не int128 ? :)


Riply   (2007-11-05 15:35:00) [17]

> [29] sniknik ©   (05.11.07 15:30)
> это естественно уже потом сархивировать полученную "компактную" структуру.

Так они и поступают.


Riply   (2007-11-05 15:32:00) [18]

> [27] sniknik ©   (05.11.07 15:28)
>в "твоей" (MFT) будет больше на больших файлах где на смещение 1 байта будет явно не хватать
>(считаю что DataOffset это смещение данных от начала файла)

Ты невнимательно посмотрел структуру. DataOffset может содержать и Int64

>а минимально возможной описательной частью будет 3 байта.

Минимальная структура - 1 байт :)


KilkennyCat   (2007-11-05 15:30:00) [19]


> sniknik ©   (05.11.07 15:28) [27]
> простой текстовый файл будет компактнее


Неа. Он не совсем простой. А вот идеально простому текстовомуфайлу одного байта на символ слишком много.


sniknik   (2007-11-05 15:30:00) [20]

> Я могу и компактнее придумать, но это уже кодирование начнется...
архивы думаю не рассматриваются... это естественно уже потом сархивировать полученную "компактную" структуру.


Страницы:   1 2 3

Наверх

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