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