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 15:29:00) [21]

> [26] KilkennyCat   (05.11.07 15:23)
> Я могу и компактнее придумать, но это уже кодирование начнется...
Не сомневаюсь.
Но они (Microsoft), остановились именно на этом способе.
Из каких соображений, нам не доложили :)
Знаю одно: шла драка за совмещение компактности и скорости.


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

> Мне кажется, что компактнее сложно придумать :)
легко!
простой текстовый файл будет компактнее

в "твоей" (MFT) будет больше на больших файлах где на смещение 1 байта будет явно не хватать (считаю что DataOffset это смещение данных от начала файла), а минимально возможной описательной частью будет 3 байта.

линуксовый с одним завершающим строку #10 будет еще компактнее.


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

Я могу и компактнее придумать, но это уже кодирование начнется...


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

> [24] Riply ©   (05.11.07 15:13)
И DataLength и DataOffset могут иметь нулевую длинну.


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

> [23] homm ©   (05.11.07 15:07)
> Что в данном случае будет DataOffset ?

Ну это надо подогнать под свои нужды.
В некоторых структурах MFT сначала подряд "заголовки" (первая конструкция),
а потом сами данные, слитые в одно целое. В этом случае DataOffset - оффсет до
наших данных с размером DataLength.

Можно попробовать располагать данные сразу после заголовка.
Тогда необходимость в DataOffset пропадает.


homm   (2007-11-05 15:07:00) [26]

> [22] Riply ©   (05.11.07 14:58)

Что в данном случае будет DataOffset ?


Riply   (2007-11-05 14:58:00) [27]

Можно содрать способ хранения с MFT:
Первые два поля по пол байта.
//       0.5 Byte          0.5 Byte
//---|----------------|----------------|----------------|----------------|--------
//.. | Length of      | Length of      |                |                | .....
//   | var DataOffset | var DataLength |   DataLength   |   DataOffset   |
//---|----------------|----------------|----------------|----------------|--------

//    DataOffset ---------->|
//                          |
//          ----------------|--------------------------------|----------------
//           ....           |   Data described               |  ........
//                          |   by Element                   |
//          ----------------|--------------------------------|----------------
//                          |                                |
//                          |<----- DataLength-------------->|


Мне кажется, что компактнее сложно придумать :)


homm   (2007-11-05 14:31:00) [28]

> [19] Anatoly Podgoretsky ©   (05.11.07 14:22)
> У тебя тоже не корректно

Для матиматики, приведенной в [12] вполне корректно :) Просто символы вместо строк, зачем что-то еще.


ProgRAMmer Dimonych   (2007-11-05 14:29:00) [29]

> Anatoly Podgoretsky ©   (05.11.07 14:20) [18]
> И каждую размером в 1 байт.

Невыгодно: трафик до килобайтов округляется :)

> Кроме того, ты явно не знаешь, что такое строка и нужен
> ли ей счетчик.

Так ведь задача-то не моя.

> Anatoly Podgoretsky ©   (05.11.07 14:22) [19]
> У тебя тоже не корректно, одна строка это
> <1 Символ> + CRLF

Тогда зачем длину строки указывать в файле? Читаем до CRLF - и усё.


Anatoly Podgoretsky   (2007-11-05 14:22:00) [30]

> homm  (05.11.2007 14:13:16)  [16]

У тебя тоже не корректно, одна строка это

<1 Символ> + CRLF


Anatoly Podgoretsky   (2007-11-05 14:20:00) [31]

> ProgRAMmer Dimonych  (05.11.2007 13:55:12)  [12]

> Я лучше в эти 280 МБ книжек полезных накачаю из интернета.

И каждую размером в 1 байт.
Кроме того, ты явно не знаешь, что такое строка и нужен ли ей счетчик.


ProgRAMmer Dimonych   (2007-11-05 14:19:00) [32]

> homm ©   (05.11.07 14:13) [16]
> Ты явно что-то не понял, сравни с моим вариантом:
> <1 Символ>

Перечитал, понял, оценил. Только такой вариант уже не будет соответствовать условию задачи, где длины строк переваливают за 255 символов, хотя и редко. :)


homm   (2007-11-05 14:13:00) [33]

> [14] ProgRAMmer Dimonych ©   (05.11.07 14:04)
> А вариант с Word'ом:
>
> 00 01 <1 Символ>

Ты явно что-то не понял, сравни с моим вариантом:

<1 Символ>


TUser   (2007-11-05 14:09:00) [34]

А что чтение/запись таких строк есть единственная задача вашей программы, или она все-таки должна в режиме реального времени как можно быстрее реагировать на запуск межконтинентальной ракеты вероятным противником и кидать смс Балуевскому через веб-форму Билайна? Это я к тому, что скорее всего, реальная задача - не только работа с диском, но и какие-нибудь расчеты, траекторий, допустим, и, скажем, отображение ракеты с помощью ДиректХ, и так чтобы земной шарик вертеть при этом было можно мышкой. И все это выполняется намного чаще и требует оптимизации, потому что от этого зависит скорость работы пользователя. А чтение данных с диска в большинстве случаев оптимизации вообще не требует. Ну выполняется эта операция один раз в сутки в течении пяти секунд, а вы сделаете не пять, а 4,8. Кто это заметит?


ProgRAMmer Dimonych   (2007-11-05 14:04:00) [35]

> homm ©   (05.11.07 13:59) [13]
> 700 мегабайтный файл строк из одного символа? 140 из оставшихся
> мегабайт будут содержать нули, а еше 140 единицы.

Да нет, вроде 280 МБ лишних нулей по сравнению с 2-байтной длиной строки. Т.к. для каждой строки что-то типа:

00 00 00 01 <1 Символ>

А вариант с Word'ом:

00 01 <1 Символ>

Так что, AlexanderMS ©, на Word переходить стоит (раз есть такая возможность), а насчёт быстродействия:

> homm ©   (05.11.07 06:54) [1]


homm   (2007-11-05 13:59:00) [36]

> [12] ProgRAMmer Dimonych ©   (05.11.07 13:55)
> Т.е. 700 МБайтный файл будет содержать 280 МБ нулей.

700 мегабайтный файл строк из одного символа? 140 из оставшихся мегабайт будут содержать нули, а еше 140 единицы. Да лучше на оставшиеся 280Мб тоже книжек накачаю и сделаю нормальный файл 140Мб.


ProgRAMmer Dimonych   (2007-11-05 13:55:00) [37]

> Однокамушкин   (05.11.07 08:04) [4]
> Но экономить два байта на диске при нынешних их объёмах - это уже из
> области извращений

Йа извращенец. :) Загоняю в программу кучу строк, состоящих из одного символа (условию не противоречит).

> Строк в файле может быть достаточно много.

Тогда Ваши 2 лишних байта составят 2/5 лишнего объёма файла. Т.е. 700 МБайтный файл будет содержать 280 МБ нулей. Я лучше в эти 280 МБ книжек полезных накачаю из интернета.

В контексте данной задачи извращением можно считать, пожалуй, только подход, который используется в MIDI-файлах (см. описание), и то необязательно.


Anatoly Podgoretsky   (2007-11-05 13:28:00) [38]

> Однокамушкин  (05.11.2007 13:05:09)  [9]

Не совсем так, кто жаловался на Cardinal, вот теже самые пертрубации происходили и с DWORD
После 16 бит у Борланда серьезные проблемы с беззнаковыми числами.


Однокамушкин   (2007-11-05 13:16:00) [39]


> AlexanderMS ©   (05.11.07 08:59) [8]
> Но если использовать Integer и файл "битый", то SetLength(S,
>  Очень большое число) даст большое зависание,

А какая версия Delphi? У меня в семёрке нет никакого зависания: либо всё работает, либо строка становится пустой (если число больше MaxInt), либо возникает исключение AV (если число меньше или равно MaxInt, но больше некоторой максимально возможной границы), а AV очень легко ловится


Однокамушкин   (2007-11-05 13:05:00) [40]


> Anatoly Podgoretsky ©   (05.11.07 08:51) [6]
>
> Так и DWORD тоже.
> Неисповедимы пути Борланда с Cardinal

DWORD вообще не является встроенным в язык типом, поэтому не является ни generic, ни fundamental... А ещё DWORD определён как синонми встроенного типа LongWord, который относится как раз к фундаментальным (проверено в Delphi 7)


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

Наверх

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