Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая запись на жесткий диск, разбираюсь в алгоритме создания файлов 
V
    Опции темы
_Y_
Дата 9.5.2013, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Стоит задача максимально быстрой записи на диск большого количества данных. Данные генерирует прибор и они представляют из себя просто поток чисел. Числа приходят порциями (массивами). Количество записываемых данных ограничено максимальным размером файла.

Разбираю работающий, но очень косо написанный алгоритм, выполняющий запись такого файла. Пытаюсь разобраться как он работает и, главное, почему он написан именно так. Из этого чужого кода извлек следующее.

На диске сначала формируется файл посчитанного (смотри ниже) размера, а потом порции данных пишутся уже в отведенный файл. При записи каждой порции, естественно, указывется в какое место файла ее писать. Это все понятно, а вот в определении размера файла я несколько запутался.
  • На вход подается желаемый максимальный размер файла M.
  • С жесткого диска считывается размер сектора (S) и максимальный размер файла уменьшается так, чтобы файл занимал целое число секторов: M=(M\S)*S.
  • Размер порции данных, записываемой за один раз, известен (B). Максимальный размер файла еще раз уменьшается так, чтобы в файл помещалось целое число порций: M=(M\B)*B.
  • Создается файл этого уменьшенного размера - и поехали записывать данные.

Что-то мне непонятно зачем надо сначала подгонять размер файла под размер сектора?

ЗЫ: Размер сектора всегда меньше, чем размер порции данных.

Спасибо


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Pavia
Дата 9.5.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Цитата(_Y_ @  9.5.2013,  13:54 Найти цитируемый пост)
Стоит задача максимально быстрой записи на диск большого количества данных.

Купи SSD или пиши в RAM или ещё куда и не занимайся ерундой.
Некому твои 0.1% выигрыша в скорости не нужны когда как легко скорость поднимается заменой комплектующих, а это десятки сотни процентов выигрыша.
Что касается быстрой записи, то пиши просто порциями большого размера. Размер порции определяешь путём тестирования жесткого. А можно один раз протестировать перед разработкой программы и забыть как константу. 

Цитата(_Y_ @  9.5.2013,  13:54 Найти цитируемый пост)
Что-то мне непонятно зачем надо сначала подгонять размер файла под размер сектора?

Есть миф что для записи нужно писать кратно сектору. Но это всего лишь миф. Видимо просто остался и стереть лишней код забыли или автор не знает что такое общее кратное.

PM MAIL   Вверх
Mirkes
Дата 9.5.2013, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Не совсем так
Цитата(Pavia @  9.5.2013,  15:05 Найти цитируемый пост)
Есть миф что для записи нужно писать кратно сектору. Но это всего лишь миф. Видимо просто остался и стереть лишней код забыли или автор не знает что такое общее кратное.

Ребята просто хотели избежать потерь места на записанных файлах. Видимо очень старая программа. Сейчас если уж привязываться то к размеру кластера. При записи файла размером в 1 байт все равно выделяется кластер. Однако, если реч не идет о записи многих тысяч файлов этим точно можно пренебречь.
Кроме того, новые системы поддерживают большие файлы и проще записать один большой, чем 10 маленьких.
Это все, что можно сказать не зная как файлы будут использоваться дальше.


--------------------
Mirkes
PM MAIL   Вверх
_Y_
Дата 9.5.2013, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Pavia, спасибо за ответ. 

Первый пункт мне не подходит. Задача промышленная, RAM-а нужных размеров не бывает просто. Да и пишу я не на обычный жесткий диск из интернет магазина.

Запись порциями большого размера - это именно то, что и делается. Величина B в моем описании не маленькая.

Про лишний код я тоже подумал. Проблема в том, что писавший это разработчик - отнюдь не юниор, а персонаж весьма в данной области уважаемый. Забыть код почистить мог, конечно, а вот про кратное точно знает. Был бы он начинающим, я бы не задумываясь исправил и дальше пошел, а вместо этого сюда пишу - может сам я чего-то недогоняю?

Добавлено @ 16:00
Mirkes, как файлы будут использоваться я тоже не знаю. Но это и не важно. Задача - записать в заданном формате и прочитать записанное с целью контроля записи - не более того. Чукча не читатель, чукча писатель. smile 

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

Это сообщение отредактировал(а) _Y_ - 9.5.2013, 16:02


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
beroal
Дата 9.5.2013, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: нет
Всего: 3



Если B кратен S, то двухступенчатый алгоритм даст тот же результат, что и одноступенчатый для B, это можно доказать.

Остаётся спросить у автора или не париться. Даже самые опытные люди делают ошибки и глупости. Humanum errare est.

Ваши формулы, наверное, должны быть такими: M=floor(M/S)*S.
PM WWW   Вверх
_Y_
Дата 9.5.2013, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



beroal, по первому пункту - это ИМХО очевидно.

У автора спросить в ближайшее время не удастся. Да, скорее всего, он уже и не помнит этот код.

floor(M/S) и M\S, сколь помню, разные записи одной и той же операции. Извиняюсь если написал непонятно.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Pavia
Дата 9.5.2013, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



_Y_
Цитата(_Y_ @  9.5.2013,  15:46 Найти цитируемый пост)
Первый пункт мне не подходит. Задача промышленная, RAM-а нужных размеров не бывает просто. Да и пишу я не на обычный жесткий диск из интернет магазина.

С этого и надо было начинать.  Всё таки не мешает выяснить связь B и S. Может кратность учитывается в другом месте программы и эти переменные кратны? Но в любом случае первая строчка лишняя. 
Единственное что может быть ваш диск не размечен и тогда да его надо первоначально привести к размеру кластера. 
(Размер диска обычно кратен сектору, но не обязан быть кратен кластеру) .  Далее делается разметка диска а после уже идет усечение до размера записываемой информации.
Строчки идут подряд?
M=(M\S)*S.
M=(M\B)*B. 
Если между строчками есть код, то там может быть не очевидный вызов метода класса или функции или макрос которую вы просто проглядели. В Си++ это очень легко сделать, в том смысле что легко проглядеть.

Mirkes
Цитата(Mirkes @  9.5.2013,  15:46 Найти цитируемый пост)
Ребята просто хотели избежать потерь места на записанных файлах. Видимо очень старая программа. Сейчас если уж привязываться то к размеру кластера. При записи файла размером в 1 байт все равно выделяется кластер. Однако, если реч не идет о записи многих тысяч файлов этим точно можно пренебречь.Кроме того, новые системы поддерживают большие файлы и проще записать один большой, чем 10 маленьких.Это все, что можно сказать не зная как файлы будут использоваться дальше.

Если хотели избежать, то надо вычислять кратность. А во вторых файлы должны быть очень маленькими или кластеры очень большими.
Не выделяется. Уже давно есть ФС в которых в одном кластере находятся несколько файлов, к примеру NTFS. (Да, пример не очень, но по лучше пример искать лень) В самодельном хранилище данных скорее всего будет и самодельная ФС, а что там нагородили только авторам известно.



Это сообщение отредактировал(а) Pavia - 9.5.2013, 19:02
PM MAIL   Вверх
_Y_
Дата 9.5.2013, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Pavia @  9.5.2013,  18:56 Найти цитируемый пост)
Всё таки не мешает выяснить связь B и S

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

Цитата(Pavia @  9.5.2013,  18:56 Найти цитируемый пост)
Строчки идут подряд?
M=(M\S)*S.
M=(M\B)*B. 

Строчек там нет - язык графический smile но операции идут подряд.

А может действительно в старом коде между ними что-то было, это что-то убрали, а переписывать логику руки не дошли?

Что за файловая система надо посмотреть. Явно не самодельная, но, возможно, поставленная производителем дисков.

-------------- 

Спасибо всем за советы. Я, понемногу, начинаю догонять как надо сделать. Потестирую свои решения - отпишусь.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Akina
Дата 9.5.2013, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 453



Цитата(_Y_ @  9.5.2013,  14:54 Найти цитируемый пост)
Что-то мне непонятно зачем надо сначала подгонять размер файла под размер сектора?

В описанном виде это не имеет НИКАКОГО смысла. Что-то либо убрано, либо недописано.Второе мне кажется более вероятным - заработало, и ладно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
volatile
Дата 10.5.2013, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(_Y_ @  9.5.2013,  13:54 Найти цитируемый пост)
Стоит задача максимально быстрой записи на диск большого количества данных

Программно вы врядли что-либо ускорите. Исключение составляет случай, когда новички пишут по-байтно без буферизации.
(но думаю это не тот случай.)
Если же буферизация есть, вы ничего заметно не ускорите.  
Тормозит железо. А процессор ожидает, его готовности.   smile 

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

Ну и конечно, буфер должен был кратен кластеру. 

Еще возможно стоит отключить кеширование записи. по крайней мере поиграцца с параметрами кеширования.
(но это уже системные дела)




Это сообщение отредактировал(а) volatile - 10.5.2013, 01:58
PM MAIL   Вверх
_Y_
Дата 10.5.2013, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Akina @  9.5.2013,  22:13 Найти цитируемый пост)
Что-то либо убрано, либо недописано ... заработало, и ладно.

Пожалуй, что именно от этой гипотезы я уже и отталкиваюсь.

Цитата(volatile @  10.5.2013,  01:46 Найти цитируемый пост)
Программно вы врядли что-либо ускорите. 

Ну, как сказать. Есть разные способы записи данных и скоость у них, как ни крути, разная. Но я , видимо, неясно выразился в самом начале. Я не остараюсь увеличить скорость. Эта задча уже решена предидущим разработчиком. Я развиваю программу дальше и мои вопросы вызваны, скорее, желанием не накосячить (что нетрудно если менять код, не полност'ю его понимая).

Цитата(volatile @  10.5.2013,  01:46 Найти цитируемый пост)
Исключение составляет случай, когда новички пишут по-байтно без буферизации.

Буферизация отключена, но пишется не побайтно, а блоками.

Но расскажите, пожалуйста, почему, чтобы добиться эффекта этим методом, надо обязательно быть новичком?

volatile, спасибо за общие замечания по архитектуре. Пока проблемы у меня тол'ко с пониманием кода, относящегося к записи. С архитектурой программы справляюсь  smile 




--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Mirkes
Дата 10.5.2013, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Цитата(_Y_ @  10.5.2013,  10:39 Найти цитируемый пост)
Но расскажите, пожалуйста, почему, чтобы добиться эффекта этим методом, надо обязательно быть новичком?

Потому, что у "старичков" блоковая запись на уровне рефлексов. От-туда кстати могла появиться нормировка на блок, просто рефлекторно.


--------------------
Mirkes
PM MAIL   Вверх
volatile
Дата 10.5.2013, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(_Y_ @  9.5.2013,  19:13 Найти цитируемый пост)

M=(M\S)*S.
M=(M\B)*B. 
...
операции идут подряд.

_Y_, Если B кратен S, то смысла в первой операции нет, в конце он и так будет кратен S (это понятно, и здесь уже об этом писали)
Если B не кратен S, то смысла в первой операции - тоже нет smile 
В конце, в общем случае, М не будет кратен S, а округлять до S промежуточное значение имеет мало смысла.
Это чисто по логике.

Теперь по скорости записи.
Вся эта возня, вообще никак не отразицца на скорости, имхо.  smile 


Это сообщение отредактировал(а) volatile - 10.5.2013, 23:47
PM MAIL   Вверх
_Y_
Дата 12.5.2013, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



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

Код мусорный я убрал, конечно, но размер файла считаю как кратное к наименьшему общему кратному от размера блока данных (B) и размера сектора диска (S).

Это несмотря на посты объясняющие, что на размер сектора нормировать не надо. Причина в языке. В глубинах описания используемой для записи процедуры я нашел, что писать надо кратно размеру блоков. Уж надо или нет - не знаю, т.к. в код этой процедуры залезть не могу. Но это, на данный момент, и не важно - результат вполне устраивает.

Спасибо


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
beroal
Дата 12.5.2013, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: нет
Всего: 3



Цитата(_Y_ @ 9.5.2013,  14:24)
floor(M/S) и M\S, сколь помню, разные записи одной и той же операции. Извиняюсь если написал непонятно.

У нас «\» было вычитанием множеств.  smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1774 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.