![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сколько байт достаточно для хранения длины строки?
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]> Я могу и компактнее придумать, но это уже кодирование начнется...
архивы думаю не рассматриваются... это естественно уже потом сархивировать полученную "компактную" структуру.