Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Windows Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
 Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Что-то слабо гуглится. Все, что нагулилось - в разбросе от 80 КБ до 2 МБ.
Кто-нибудь уже решал подобный вопрос? Что выбрать, если времени на тестирование нет? Или на что надо посмотреть перед копированием?

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

Речь идет о копировании файлов по 50 - 300 МБ количеством от 10 до 100. Цель - максимальная скорость.
6 янв 19, 20:32    [21779223]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Dima T
Member

Откуда:
Сообщений: 13367
Поток сознания какой-то. Ты подумал так и так, сделал выводы, выжимки из них привел, ... а мы тут при чем?

Пытаюсь ванговать: писать лучше последовательно, т.к. канал один и распараллеливание будет тормозом.
6 янв 19, 20:43    [21779232]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Dima T
Поток сознания какой-то. Ты подумал так и так, сделал выводы, выжимки из них привел, ... а мы тут при чем?

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


Ну может быть. Выходные все-таки.

Основной вопрос по размеру блоков. Какими блоками лучше копировать?

По потокам: понятно, что писать надо одним потоком. Я подумал, не попытаться ли сделать упреждающее чтение с помощью потоков. Наверное, его можно и по-другому сделать.
Зачем это делать: если блоки будут достаточно большими и делать все последовательно, то сразу после записи очередного блока будет возникать потеря времени на чтение следующего блока.
6 янв 19, 21:48    [21779253]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Наверное, можно весь файл в оперативку загружать оттуда уже записывать.
6 янв 19, 21:52    [21779254]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Flying-home
Что-то слабо гуглится. Все, что нагулилось - в разбросе от 80 КБ до 2 МБ.
Кто-нибудь уже решал подобный вопрос? Что выбрать, если времени на тестирование нет? Или на что надо посмотреть перед копированием?

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

Речь идет о копировании файлов по 50 - 300 МБ количеством от 10 до 100. Цель - максимальная скорость.

Технологии меняются. И то что мы знали о флешках лет 10 назад сегодня может быть уже не совсем актуально.

По теме несколько мыслей.

1) Посмотри как ты ее форматируешь. extFS? NTFS? Можно попробовать варианты.
Для россыпи мелких файлов - можно попробовать сархивировать 7zip-ом
без сжатия и просто указать destination а флешку. Или TAR-ом.

2) Посмотри https://en.wikipedia.org/wiki/Flash_file_system может какие-то мысли будут.

3) Посмотри как ты ее включаешь? USB2.0 и USB3.0 это разные стандарты скоростей. Для тройки слот покрашен в синий.

4) Посмотри ... в магазинах комп-техники обычно пишут класс памяти. Ну.. для SD точно пишут. Обычно этот
класс и определяет предельную скорость. Если ты уперся в него то уже никакие многопоточки не помогу.
6 янв 19, 22:12    [21779261]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
mayton
Flying-home
Что-то слабо гуглится. Все, что нагулилось - в разбросе от 80 КБ до 2 МБ.
Кто-нибудь уже решал подобный вопрос? Что выбрать, если времени на тестирование нет? Или на что надо посмотреть перед копированием?

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

Речь идет о копировании файлов по 50 - 300 МБ количеством от 10 до 100. Цель - максимальная скорость.

Технологии меняются. И то что мы знали о флешках лет 10 назад сегодня может быть уже не совсем актуально.

По теме несколько мыслей.

1) Посмотри как ты ее форматируешь. extFS? NTFS? Можно попробовать варианты.
Для россыпи мелких файлов - можно попробовать сархивировать 7zip-ом
без сжатия и просто указать destination а флешку. Или TAR-ом.

2) Посмотри https://en.wikipedia.org/wiki/Flash_file_system может какие-то мысли будут.

3) Посмотри как ты ее включаешь? USB2.0 и USB3.0 это разные стандарты скоростей. Для тройки слот покрашен в синий.

4) Посмотри ... в магазинах комп-техники обычно пишут класс памяти. Ну.. для SD точно пишут. Обычно этот
класс и определяет предельную скорость. Если ты уперся в него то уже никакие многопоточки не помогу.

Не, нужно решение под "просто какую-то флэшку".
То есть, сделать программную оптимизацию под неизвестно что. Неизвестно, что будет за комп, будет ли у него USB 3.0, неизвестно, что будет за ось, неизвестно, что будет за флэшка.
Все, на чем можно сыграть - то, с чего я начал топик. Размер блока и упреждающее чтение.
А комп может оказаться и хрюшей с 512 МБ, и десятка с 16 ГБ оперативки.

В первом приближении это давно реализовано в Тотал коммандере. У него в настройках есть варианты копирования "по хорошему" и "как в проводнике".
7 янв 19, 05:33    [21779321]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Ну за 10 экспериментов с разным размером блока ты можешь найти оптимальный.

А мы тебе чем тут поможем?
7 янв 19, 10:56    [21779339]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
mayton
Ну за 10 экспериментов с разным размером блока ты можешь найти оптимальный.

А мы тебе чем тут поможем?

А зачем форумы вообще нужны?
Любому вопрошающему можно сказать, что потрудившись и почитав справку он сам найдет нужное решение.

Может, кто-то уже решал подобную задачу?
7 янв 19, 13:22    [21779377]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Flying-home
mayton
Ну за 10 экспериментов с разным размером блока ты можешь найти оптимальный.

А мы тебе чем тут поможем?

А зачем форумы вообще нужны?
Любому вопрошающему можно сказать, что потрудившись и почитав справку он сам найдет нужное решение.

Может, кто-то уже решал подобную задачу?

Покажи свой сорц.
7 янв 19, 13:24    [21779379]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
miksoft
Member

Откуда:
Сообщений: 37358
mayton
Ну за 10 экспериментов с разным размером блока ты можешь найти оптимальный.
Даже если этот оптимум существует (в чем я сомневаюсь), то это будет оптимум конкретной модели флешки. Для другой модели/ревизии/firmware он может быть другим.
7 янв 19, 13:57    [21779401]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
vikkiv
Member

Откуда: London
Сообщений: 1853
есть и другие критерии - физический размер блока на чипе памяти например (которые между делом имеют ограниченное число циклов записи, поэтому переписывать блоки которуе не обязательно переписывать - черевато преждевременным износом)
размер блока смотреть надо кратный размеру блока чипа (через целый множитель), хотя здесь стандарт - так что не промазать

на современных чипах flash памяти размер блока начинается от 512Кб+ (смотришь сколько страниц на чипе, делишь объём)
дальше нюансы, к примеру по файлам - если файлы по 2кб - то писать их (если каждый отдельно, последовательно, потом переход к следующему, а не группой) блоками по 64Кб может быть дороговато.

с другой стороны - ставь USB 3.2 (ту которая 2x2 , т.е. 2.5 GB/sec) или 3.1 (1.25 GB/sec) и забудь об этих мелочах.
7 янв 19, 14:16    [21779410]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
С точки зрения бизнеса. Как звучит постановка. Если надо просто скопировать файл - то это фигня.
Потому что финал этой операции находится не здесь. А после отмонтирования флешки.

Тоесть мне как конечному пользователю системы неинтересно быстро или медленно копирует
процесс. Мне интересно чтобы я смог быстро нажать мышкой Unmount. И сброс буферов
произошёл-бы максимально быстро.

Тоесть мы имеем дело со сложным стеком технологий Операционка+софт+драйвер флешки
и просто так угадать какой нужен размер блока практически невозможно.
7 янв 19, 14:41    [21779420]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47094
Flying-home
Зачем это делать: если блоки будут достаточно большими и делать все последовательно, то сразу после записи очередного блока будет возникать потеря времени на чтение следующего блока.

Так это не зависит от размера блока. Используй overlapped I/O или читай и пиши разными потоками. Двух буферов по мегабайту хватит наверняка. Ну и экстремальные виды оптимизации типа FILE_FLAG_NO_BUFFERING (O_DIRECT) не забудь.
7 янв 19, 15:09    [21779449]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Спасибо всем.

Я маленькие файлы пока не рассматриваю. Размер - от 50 МБ. Соответственно, и буферы рассматриваю большие (кратные 4КБ).

При копировании с одного сата-диска на другой по моей (пока недостаточной) статистике оптимальным представляется буфер 40 или 80 МБ. Может, и больше.

Думаю вот, насколько такие буферы применимы к флэшкам? Если у нее свободное пространство фрагментировано, что будет?
9 янв 19, 22:10    [21781065]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Dimitry Sibiryakov
Flying-home
Зачем это делать: если блоки будут достаточно большими и делать все последовательно, то сразу после записи очередного блока будет возникать потеря времени на чтение следующего блока.

Так это не зависит от размера блока. Используй overlapped I/O или читай и пиши разными потоками. Двух буферов по мегабайту хватит наверняка. Ну и экстремальные виды оптимизации типа FILE_FLAG_NO_BUFFERING (O_DIRECT) не забудь.

Я пока думаю о двух потоках.
9 янв 19, 22:12    [21781067]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Ну... сорцов мы не дождались. Так ште... good luck.
9 янв 19, 22:13    [21781068]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Dima T
Member

Откуда:
Сообщений: 13367
Если речь о простом копировании файлов в виндовсе, то есть штатные средства CopyFile() и CopyFileEx()
10 янв 19, 07:22    [21781198]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47094
Flying-home
При копировании с одного сата-диска на другой по моей (пока недостаточной) статистике оптимальным представляется буфер 40 или 80 МБ.

Совершенно избыточны такие буфера. Скорость копирования перестаёт расти уже на 64 кб.
10 янв 19, 15:05    [21781714]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
mayton
Ну... сорцов мы не дождались. Так ште... good luck.

Дык, их еще просто нет. Я обычно сперва вопросы задаю, а потом уже что-то пишу.
ЗЫ А зачем тебе сорцы?
10 янв 19, 20:02    [21782144]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Flying-home
mayton
Ну... сорцов мы не дождались. Так ште... good luck.

Дык, их еще просто нет. Я обычно сперва вопросы задаю, а потом уже что-то пишу.
ЗЫ А зачем тебе сорцы?

В этом форуме обычно обсуждают предмет программирвоания. А он как ни странно
связан с сорцами. Тем более что в вашем случае мы имеем дело даже не с алгоритмом
которого здесь нет. А с кодингом под Windows.

Читайте Джефа Рихтера. У него был пример быстрого копирования.
10 янв 19, 20:19    [21782155]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Dimitry Sibiryakov
Flying-home
При копировании с одного сата-диска на другой по моей (пока недостаточной) статистике оптимальным представляется буфер 40 или 80 МБ.

Совершенно избыточны такие буфера. Скорость копирования перестаёт расти уже на 64 кб.

У меня на 40 МБ перестала расти. Может, у меня какой-то не общий случай, может с размерами файлов какая-то коллизия произошла, надо будет еще посмотреть.

С одной стороны, чем больше буфер, тем больше можно выиграть на "бесшовном" копировании группы файлов, с другой - в задаче файлы от 50 МБ, и если их два, то смысла в бОльших буферах действительно нет.

Кстати, можно еще выиграть время на начальном чтении. Начинать копировать маленькими буферами и постепенно увеличивать размер до рабочего.

К сообщению приложен файл (статистика.xls - 48Kb) cкачать
10 янв 19, 20:20    [21782156]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
mayton
Flying-home
пропущено...

Дык, их еще просто нет. Я обычно сперва вопросы задаю, а потом уже что-то пишу.
ЗЫ А зачем тебе сорцы?

В этом форуме обычно обсуждают предмет программирвоания. А он как ни странно
связан с сорцами. Тем более что в вашем случае мы имеем дело даже не с алгоритмом
которого здесь нет. А с кодингом под Windows.

Читайте Джефа Рихтера. У него был пример быстрого копирования.

Ну, я сейчас обдумываю именно алгоритм. Потому и зашел в общий топик. Если бы были вопросы по Дельфе, пошел бы туда.
10 янв 19, 20:24    [21782160]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Flying-home
mayton
пропущено...

В этом форуме обычно обсуждают предмет программирвоания. А он как ни странно
связан с сорцами. Тем более что в вашем случае мы имеем дело даже не с алгоритмом
которого здесь нет. А с кодингом под Windows.

Читайте Джефа Рихтера. У него был пример быстрого копирования.

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

И какой у вас сейчас алгоритм?
10 янв 19, 20:25    [21782162]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Во стыдоба...
Перепутал все, что можно было перепутать. Большее с меньшим, размеры буфера...
Праздники удались.
11 янв 19, 00:54    [21782336]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4254
Flying-home,

наверное надо прыгать от самой распространённой FS на флэш-накопителях: Fat32
вики
Размер кластера по умолчанию для файловой системы FAT32 составляет от 512 байт до 32 КБ в зависимости от размера тома и конкретной версии ОС[2].При использовании размера кластера, равного 32768 байт, максимальный размер тома составит чуть менее 8 ТБ[3]. Хотя размер сектора может быть любым, традиционно он считается равным 1 сектору диска и равен 512 байт и т.к. эта величина не менялась с момента создания — она может считаться некоторым ПО как константа.
11 янв 19, 12:39    [21782677]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47094
Flying-home
У меня на 40 МБ перестала расти. Может, у меня какой-то не общий случай, может с размерами файлов какая-то коллизия произошла, надо будет еще посмотреть.

С алгоритмом у тебя коллизия скорее всего произошла. На 40 мегабайтах разница по времени между логической записью в кэш и физическим обменом с флэшкой стала достаточной для того, чтобы следующий блок успел прочитаться с винта.
11 янв 19, 15:05    [21782916]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Dimitry Sibiryakov
Flying-home
У меня на 40 МБ перестала расти. Может, у меня какой-то не общий случай, может с размерами файлов какая-то коллизия произошла, надо будет еще посмотреть.

С алгоритмом у тебя коллизия скорее всего произошла. На 40 мегабайтах разница по времени между логической записью в кэш и физическим обменом с флэшкой стала достаточной для того, чтобы следующий блок успел прочитаться с винта.

Я еще до флэшки не дошел, пока только с сата винчестерами балуюсь. И до FILE_FLAG_NO_BUFFERING тоже еще не добрался. Рихтера уже начал читать. Очень доходчиво пишет, респект ему.

Чтобы было с чем сравнивать, я сделал эталон:
Использую виндовый буфер, применяю FILE_FLAG_SEQUENTIAL_SCAN, принудительно сбрасываю буфера по очереди после того, как вся группа файлов формально скопируется. Недостаток этого метода в том, что винда сбрасывает буфера когда захочет и делает это параллельно, это заметно снижает скорость записи на диск. Тут я ничего поделать не могу. Алгоритм копирования тут особого значения не имеет, поскольку запись идет всегда в память и начинает задерживаться только когда буфер переполняется.

С этим эталоном я сравниваю свой алгоритм:
Чтение с использованием буфера, запись - "через буфер" (FILE_FLAG_WRITE_THROUGH) алгоритм для одного жесткого диска - один поток, один блок, для разных дисков - два потока, два блока. Играю размерами блоков, вижу, что чем больше, тем лучше. 64 МБ - самое то. У эталона выигрываю 8% на одном диске и 15% на разных дисках.
Это я сделал, потому что думал, что винда правильно и качественно сбрасывает буфера. Кто ей мешает, например, использовать для этого тот же алгоритм, что и в FILE_FLAG_NO_BUFFERING, и делать все последовательно? Но нет.

Пока еще у меня все сырое, но буду держать вас в курсе.
:)
20 янв 19, 14:22    [21789636]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный размер блока при записи файла на флэшку  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14260
Набросал тут мысли по поводу:

Что зависит от программиста:

Алгоритм копирования:

  • один поток, один блок (полезно для копирования на тот же диск)
  • два потока, несколько блоков (для копирования на другой диск)

    Соответственно, можно играть с размерками блоков и их количеством. Можно копировать файлы с помощью соответствующего виндового диалога

    Способы открытия файлов:

  • для чтения: с буфером, без буфера
  • для записи: с буфером, "через буфер", без буфера

    Для вариантов с буфером полезен флаг FILE_FLAG_SEQUENTIAL_SCAN, при использовании буфера можно принудительно сбрасывать буфера на диск, можно не сбрасывать.


    Специфика окружения, от которой может зависеть выбор алгоритма и способа открытия файлов:

    Источник и целевой файлы могут находиться

  • на одном физическом носителе
  • на разных носителях


    Источник и целевой файлы могут находиться

  • на жестком диске
  • на твердотельном накопителе
  • на RAID массиве
  • на компакт, DVD диске
  • на съемном флэш-накопителе (для которого винда либо включила буферизацию, либо нет)
  • в локальной сети
  • на подключенном к компьютеру смартфоне (носители которого либо распознаются системой как диски, либо нет)

    Носители могут иметь различные

  • файловые системы
  • размеры сектора
  • размеры кластера

    Про сектора наверное, можно забыть и оперировать только размерами кластера (подгонять под них размеры блоков)

    Продвинутость пользователя
    Одного пользователя можно ненавязчиво спросить, расположены ли C:\ и D:\ на одном HDD, другого - нельзя.

    Ограничения операционной системы
    Еще не пробовал, но кажется, програмная попытка получить ответ на предыдущий вопрос под ограниченным в правах пользователем с включенным УАКом может потерпеть крах и / или испугать пользователя.
    Тоже самое с попыткой выяснить размер кластера и количество свободного места на диске (предполагаю)
  • 20 янв 19, 14:32    [21789639]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Забыл сказать, что при копировании двумя потоками у меня упреждающее чтение работает и между файлами.
    То есть, когда записывающий поток заканчивает с одним файлом, читающий уже начинает со следующим.
    20 янв 19, 14:46    [21789648]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    И еще я пока не вижу преимуществ overlapped I/O. Если у меня и так все длительные операции в отдельных потоках и у пользователя ГУИ не тормозит, зачем он может быть нужен?
    20 янв 19, 14:54    [21789652]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Leonid Kudryavtsev
    Member

    Откуда:
    Сообщений: 7443
    Flying-home
    И еще я пока не вижу преимуществ overlapped I/O. Если у меня и так все длительные операции в отдельных потоках и у пользователя ГУИ не тормозит, зачем он может быть нужен?

    AFAIK & IMHO overlapped IO позволяет уменьшить кол-во потоков. Если у тебя 2-3 потока - то все нормально, а если 200-300 потоков, то тогда уже на переключении потоков будет overhead.

    AFAIK & IMHO для обычных дисков, до 1 Mb рост скорости от увеличения буфера вполне чувствуется без всяких замеров, до 8 Mb уже не столь существеннено. Больше (для обычных дисков) может потребоваться только если чтение и запись идет одновременно с одного и того же диска (уменьшаем перемешение головок), но тут приделов нету. И до 512 Mb можно выгоду почувствовать

    На SSD-флешке головок нет, мне кажется 64 Mb тут сильно лишнее.
    20 янв 19, 16:54    [21789723]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Leonid Kudryavtsev
    мне кажется 64 Mb тут сильно лишнее.

    А чем плохо? Только тем, что перед копированием надо узнать, сколько некэшируемой оперативки может выделить система приложению? Может, действительно, три блока по 64 МБ будет тяжело?


    Leonid Kudryavtsev
    Если у тебя 2-3 потока - то все нормально, а если 200-300 потоков, то тогда уже на переключении потоков будет overhead.

    У меня всего 2 потока. Зачем больше? Для упреждающего чтения достаточно количество блоков увеличить.
    20 янв 19, 18:36    [21789776]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    А, кстати.
    Рихтер пишет, что для выделения блоков использует VirtualAlloc, потому что так данные выравниваются в памяти правильно. А что, обычный GetMem не будет выравнивать?
    20 янв 19, 18:39    [21789778]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Flying-home
    на компакт, DVD диске

    Интерсно, как лучше с них читать? Думаю, с обычной буферизацией.

    Flying-home
    на подключенном к компьютеру смартфоне (носители которого либо распознаются системой как диски, либо нет)

    А кто-нибудь сталкивался с подобной задачей? Последние Андроиды как правило, не дают системе нормально примонтировать свои носители. Но в проводнике они видны (не как диски) и копировать файлы туда-сюда все-таки можно.
    20 янв 19, 18:46    [21789780]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Что самое смешное, что большинству пользователей вся эта оптимизация нафиг не нужна.

    Я, например, много лет назад заглянул в настройки Тоталкоммандера, увидел там разные размеры блока для одного и двух дисков, сказал "Ого", оставил все как есть и больше эти настройки не открывал. А теперь я копирую быстрее него. Как мне кажется, у Джислера во всех случаях однопоточное копирование. По крайней мере в шестой версии.
    20 янв 19, 18:58    [21789785]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Эту тему можно переносить в Windows.
    20 янв 19, 21:35    [21789837]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dimitry Sibiryakov
    Member

    Откуда:
    Сообщений: 47094
    Flying-home
    И еще я пока не вижу преимуществ overlapped I/O. Если у меня и так все длительные операции в отдельных потоках и у пользователя ГУИ не тормозит, зачем он может быть нужен?

    Overlapped I/O нужна для того чтобы НЕ использовать потоки. Это древняя технология, появившаяся ещё до многопоточности.
    21 янв 19, 15:13    [21790330]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Flying-home, почитай про "Порт завершения ввода/вывода" IO Completion Port
    21 янв 19, 15:32    [21790353]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4254
    Dimitry Sibiryakov
    Flying-home
    И еще я пока не вижу преимуществ overlapped I/O. Если у меня и так все длительные операции в отдельных потоках и у пользователя ГУИ не тормозит, зачем он может быть нужен?

    Overlapped I/O нужна для того чтобы НЕ использовать потоки. Это древняя технология, появившаяся ещё до многопоточности.
    да вроде одинаково они появились, иначе было просто нельзя мультимедиа и прочее фоновое поддерживать
    21 янв 19, 16:07    [21790386]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Эту тему можно переносить в Windows.

    Windows - подраздел "Администрирования".
    23 янв 19, 14:23    [21792161]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Разные тонкости:

    При чтении файла открытого с флагом FILE_FLAG_NO_BUFFERING параметр nNumberOfBytesToRead всегда надо указывать кратным размеру сектора. Даже в конце файла, когда известно, что прочитано будет меньше.


    Возникло ощущение, что VirtualAlloc с флагом PAGE_NOCACHE замедляет работу. Пока еще не придумал, как поточнее замерить потери. А в какой момент винда решает, что страницы можно начинать кэшировать? Если со страницами постоянно идет работа, она подождет?

    Модератор: Тема перенесена из форума "Программирование".
    23 янв 19, 14:26    [21792171]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Еще одна проблемка всплыла.
    Как узнать размер кластера на дисках:
    1. каталоги которых подключены через хардлинк.
    2. которые монтированы как NTFS папки других дисков.

    Функции GetDiskFreeSpace надо указывать корень диска да и сомнительная она, функции GetDiskFreeSpaceEx можно указывать каталог, но она не не показывает размер кластера.

    Открывать диск функцией CreateFile не хочется, надо повышать права.
    30 янв 19, 09:58    [21797474]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Посмотри fsutil
    30 янв 19, 10:49    [21797534]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Посмотри fsutil


    Ее может не быть на клиентском компе.
    30 янв 19, 13:05    [21797710]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4254
    Flying-home
    Еще одна проблемка всплыла.
    Как узнать размер кластера на дисках:
    1. каталоги которых подключены через хардлинк.
    2. которые монтированы как NTFS папки других дисков.

    Функции GetDiskFreeSpace надо указывать корень диска да и сомнительная она, функции GetDiskFreeSpaceEx можно указывать каталог, но она не не показывает размер кластера.

    Открывать диск функцией CreateFile не хочется, надо повышать права.
    1. хардлинк может быть только на этот же том

    2. это софтлинк, общего механизма нет, в общем случае драйвер может послать куда угодно взять данные откуда угодно, даже виртуальные файлы "придумать"
    30 янв 19, 13:11    [21797715]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Flying-home
    mayton
    Посмотри fsutil


    Ее может не быть на клиентском компе.

    Эта утилита использует API который тебе нужен. Типа fsutil fsinfo ntfsinfo [drive]
    Или поищи сорцы или описание у Рихтера или Руссиновича. Полюбому они
    должны были пройтись краями по этой теме.
    30 янв 19, 14:11    [21797780]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Flying-home
    пропущено...


    Ее может не быть на клиентском компе.

    Эта утилита использует API который тебе нужен. Типа fsutil fsinfo ntfsinfo [drive]
    Или поищи сорцы или описание у Рихтера или Руссиновича. Полюбому они
    должны были пройтись краями по этой теме.

    Угу.
    30 янв 19, 14:39    [21797815]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    kealon(Ruslan)
    1. хардлинк может быть только на этот же том

    Да. Я имел в виду junction points
    30 янв 19, 15:16    [21797886]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Если все делать правильно, то надо отказываться от GetDiskFreeSpace.
    Использовать DeviceIoControl с операцией IOCTL_DISK_GET_DRIVE_GEOMETRY
    Эта функция требует хэндл диска, открытого с помощью CreateFile, что в свою очередь требует повышения прав.

    По поводу симлинков: наверное, придется проверять каждую папку в пути на то, не является ли она ссылкой, и если является, смотреть, куда она указывает.
    30 янв 19, 15:53    [21797962]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Может, можно обойтись меньшей кровью? Без повышения прав? Задачи-то простые.

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

    2. Есть каталог, в который предстоит писать файлы. Права на запись в каталог есть. Доступа к корню диска может не быть. Опять же, надо узнать размер кластера.
    30 янв 19, 16:09    [21797983]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Вот еще вопрос всплыл.
    Если флэшка отформатирована под exFAT с размером кластера 32 МБ (у меня такая есть, исключительно для больших файлов), на нее что, в принципе нельзя писать маленькими блоками? Она будет каждый кластер переписывать по несколько раз?
    И с HDD, и с SSD аналогичный вопрос.
    2 фев 19, 10:47    [21800333]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 27906
    Flying-home
    Если флэшка отформатирована под exFAT с размером кластера 32 МБ (у меня такая есть, исключительно для больших файлов), на нее что, в принципе нельзя писать маленькими блоками? Она будет каждый кластер переписывать по несколько раз?
    Вообще запись буферизуется. То есть, если кластер 1Кб, и если записать 1000 раз по одному байту, то будет записан один блок размером в 1Кб
    Если же закрывать файл после записи каждого байта, то тут зависит от настроек кеширования ОС, может и 1000 раз переписать блок.
    4 фев 19, 14:06    [21801282]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    А если файл был открыт для записи с флагом FILE_FLAG_NO_BUFFERING?
    4 фев 19, 21:46    [21801591]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4254
    Flying-home,

    а можно ещё и папку заместо файла открыть, если "постараться"
    зачем банальности спрашивать
    5 фев 19, 08:01    [21801683]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    kealon(Ruslan)
    Flying-home,

    а можно ещё и папку заместо файла открыть, если "постараться"
    зачем банальности спрашивать

    Я-то не знаю, что там в контроллере флэшки. Может, защита от дурака есть?
    6 фев 19, 09:34    [21802367]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Еще интересный момент:
    Windows Server 2003, зеркало на контроллере LSI
    Файл открывался для чтения с флагом FILE_FLAG_NO_BUFFERING, размер блока - 64 МБ
    При попытке сделать первое чтение выскочила ошибка 1450 - недостаточно системных ресурсов для завершения операции.

    Почитал про ошибку. Похоже, это связано не с сервером и не с контроллером, а с фрагментацией файла.
    6 фев 19, 09:44    [21802376]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Flying-home
    kealon(Ruslan)
    Flying-home,

    а можно ещё и папку заместо файла открыть, если "постараться"
    зачем банальности спрашивать

    Я-то не знаю, что там в контроллере флэшки. Может, защита от дурака есть?

    Кстати, если предположить, что при записи блоков в 16 МБ на флэшку с кластером в 32 МБ кластера будут переписываться по два раза, то мы должны будем получить падение скорости записи примерно в 2 раза. На практике я этого не вижу.
    6 фев 19, 09:47    [21802379]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Flying-home
    Еще интересный момент:
    Windows Server 2003, зеркало на контроллере LSI
    Файл открывался для чтения с флагом FILE_FLAG_NO_BUFFERING, размер блока - 64 МБ
    При попытке сделать первое чтение выскочила ошибка 1450 - недостаточно системных ресурсов для завершения операции.

    Почитал про ошибку. Похоже, это связано не с сервером и не с контроллером, а с фрагментацией файла.

    Нет. С фрагментацией это не связано, или связано очень слабо.
    И это проблема, которую надо решать.
    Ситуация следующая:
    С файлами, открытыми с флагом FILE_FLAG_NO_BUFFERING вообще невозможны операции блоками больше 16 МБ. Ни чтение, ни запись.
    6 фев 19, 13:30    [21802648]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Еще один интересный момент:

    Внезапно обнаружил, что при прочих равных я проигрываю Тотал Коммандеру при копировании "на тот же диск" примерно 4% по скорости.
    Искал причину два дня. Когда уже почти отчаялся, вспомнил, что ТС не устанавливает размер файла сразу, а копирует как есть, размер файла растет по мере записи в него. А у меня эта фича стояла по умолчанию. Убрал ее и сразу вышел в ноль.

    В общем: при безбуферной записи установка конечного размера файла при его создании может навредить.
    Не исключено, что в моем конкретном случае это связано с последовательными чтениями и записями на одном диске.
    9 фев 19, 20:33    [21805401]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Еще одна странность, присущая, как мне кажется, Windows 7.

    Если выделять память под блоки с флагом NO_CACHE (В MSDN сказано, конечно, что этот флаг не надо без нужды использовать, но другого способа предотвратить сбрасывание страниц в своп я пока не вижу), скорость копирования падает с 58 МБ/c до 32 МБ/с. Почти в два раза. Это при безбуферном чтении и безбуферной записи.

    Похоже, память выделяется как-то не так, как надо функциям записи и чтения, работающими с FILE_FLAG_NO_BUFFERING.
    16 фев 19, 19:20    [21811772]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Несколько наблюдений.

    1.

    Лет десяток назад когда я активно качал торрентами я заметил что файловая система достаточно интеллектуальна
    в части аллокации дискового файла. Грубо говоря созданный пустой файл с нулями при перемотке seek хоть на терабайт вперед
    не аллоцирует места (sparse file). После этого я стал пристально изучать возможности NTFS, XFS, ZFS и потерял веру в человечество
    и файловый API. Сюда-же идут и буфера записи. Вобщем если кто-то хочет бенчмаркать диск, флешки, SD карты то нужно сказать всем файловым
    системам - "идите на йух". Нужно подключать сырое устройство без всякой разметки. И мерять его самым низкоуровневым
    API которое только доступно. В этом случае мы замеряем реальную скорость записи информации.

    2.

    Одна из моих флешек 64G определенно буферизирует трафик. Причем этот эффект заметен как на Windows так и на Linux.
    СНачала копирования - высокая скорость. Потом - падает чуть ли не до нуля. А потом поднимается на 10% и так и копирует
    до конца. Бенчмаркал через $ dd (disk duplicate)

    Другая старенькая на 8G. Копирует всегда медленно но стабильно.

    3.

    Флешки - микрокомьютеры с контроллерами внутри. Не просто плоская память. И мы не знаем как они работают
    и какие делают оптимизации для сбережения ресурса памяти по записи. Отсюда вобщем-то непрогнозируемая
    скорость записи. Можем в среднем прикинуть. Но не дать гарантий.
    зависит от разных внутренних состояний.

    Флешки
    16 фев 19, 19:49    [21811794]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Несколько наблюдений.

    1.

    Лет десяток назад когда я активно качал торрентами я заметил что файловая система достаточно интеллектуальна
    в части аллокации дискового файла. Грубо говоря созданный пустой файл с нулями при перемотке seek хоть на терабайт вперед
    не аллоцирует места (sparse file). После этого я стал пристально изучать возможности NTFS, XFS, ZFS и потерял веру в человечество
    и файловый API. Сюда-же идут и буфера записи. Вобщем если кто-то хочет бенчмаркать диск, флешки, SD карты то нужно сказать всем файловым
    системам - "идите на йух". Нужно подключать сырое устройство без всякой разметки. И мерять его самым низкоуровневым
    API которое только доступно. В этом случае мы замеряем реальную скорость записи информации.

    2.

    Одна из моих флешек 64G определенно буферизирует трафик. Причем этот эффект заметен как на Windows так и на Linux.
    СНачала копирования - высокая скорость. Потом - падает чуть ли не до нуля. А потом поднимается на 10% и так и копирует
    до конца. Бенчмаркал через $ dd (disk duplicate)

    Другая старенькая на 8G. Копирует всегда медленно но стабильно.

    3.

    Флешки - микрокомьютеры с контроллерами внутри. Не просто плоская память. И мы не знаем как они работают
    и какие делают оптимизации для сбережения ресурса памяти по записи. Отсюда вобщем-то непрогнозируемая
    скорость записи. Можем в среднем прикинуть. Но не дать гарантий.
    зависит от разных внутренних состояний.

    Флешки

    Да. Интересно было бы ту твою большую флэшку потестить насчет FILE_FLAG_NO_BUFFERING. У меня сейчас две 32-гиговые, не знаю, насколько умные, при записи на них стабильно выигрывается 5-10% безбуферной записью. И скорость записи не плавает.

    Еще я заметил по копированию из сети (запись на локальный диск безбуферная, чтение - с буферизацией Виндовс): Первые 8 гигов копируются с быстро, почти 70 МБ/с, потом скорость падает до 30 МБ/с. Вот как такое может быть? Файл-сервер - 2003 сервак, клиент - семерка. 8 гигов, Карл! На 8 гигах кто-то из них решает, что хватит буферизировать?
    16 фев 19, 21:32    [21811834]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Через два месяца мучений я понял, что эту работу нельзя закончить. Только прекратить.
    Сделаю копировалку, чтобы можно было прикрутить к Тоталкоммандеру, может, интеграцию в проводник, внедрю в проект, ради которого все затевалось, и пока все.

    На десятке пока не было возможности детально все потестить, но, похоже, ее проводник умеет довольно быстро копировать. С ней еще придется посоревноваться. У семерки я выигрываю от 30 до 50 процентов.
    21 фев 19, 22:27    [21816904]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    У меня появилась новая noname флешка на 8Г. Можно потестить. На корпусе толком надписей нету. Большие буквы "SP" и размер.
    Более современная. Надо полагать быстрее чем другие.

    $ lsusb
    ....
    Bus 001 Device 007: ID 8644:8005 Intenso GmbG
    
    $ hdparm /dev/sdb1
    
    /dev/sdb1:
    SG_IO: bad/missing sense data, sb[]:  70 00 05 00 00 00 00 0a 00 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     multcount     =  0 (off)
     readonly      =  0 (off)
     readahead     = 256 (on)
     geometry      = 1023/247/62, sectors = 15669216, start = 32
    
    $ mount 
    .....
    /dev/sdb1 on /media/mayton/0012-D687 type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
    


    Попробуем сгенерировать 1 Гб случайного шума и записать на нее.

    $ head -c 1G < /dev/urandom > /centos/random-1g.dat
    
    $ rsync -av --progress /centos/random-1g.dat .
    sending incremental file list
    random-1g.dat
      1,073,741,824 100%    6.35MB/s    0:02:41 (xfr#1, to-chk=0/1)
    rsync: chown "/media/mayton/0012-D687/.random-1g.dat.asQqsm" failed: Operation not permitted (1)
    
    sent 1,074,004,060 bytes  received 136 bytes  4,805,387.90 bytes/sec
    total size is 1,073,741,824  speedup is 1.00
    rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1196) [sender=3.1.2]
    


    Ситуация в динамике - такая-же как и в 64Гб флешке. Первые несколько секунд - скорость 70 Мб в сек. И потом
    падает до 5Мб и до конца идет так.
    22 фев 19, 01:37    [21816947]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 624
    Flying-home
    Цель - максимальная скорость.
    Если речь идёт только о флеше, то кроме высокоуровневых вещей нужно не забыть и низкоуровневые:
    Форматирование флешевых накопителей с выравниванием кластера на границу блока
    22 фев 19, 09:15    [21817015]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    tunknown,

    Спасибо. Чем дальше в лес, тем больше дров.

    2all

    Хотите посмеяться? Я на новогодних праздниках написал простенькую прогу, которой в лучшем случае будут пользоваться пара тысяч старых пердунов из Канады и Новой Зеландии. Так вот, когда я ее написал, и решил приступить к написанию справки, я подумал: "Надо бы сделать и свое копирование файликов. Граничные условия узкие, должно получиться хорошее ускорение по сравнению с виндовыми операциями. Пусть старики порадуются."

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

    Не, я продвинулся в мультипоточном программировании, разобрался с абстрактными методами, это хорошо. Но хотелось бы видеть горизонт, за которым этот проект можно будет остановить в приемлемом виде.
    6 мар 19, 16:09    [21826475]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Ситуация в динамике - такая-же как и в 64Гб флешке. Первые несколько секунд - скорость 70 Мб в сек. И потом
    падает до 5Мб и до конца идет так.

    А можно посчитать, сколько байт уходит на флэшку за эти "несколько секунд"? А в доке по флэшке есть информация о буфере? А может это буфер оси? Я стараюсь где можно отказываться от чужой буферизации.
    6 мар 19, 16:12    [21826483]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Это я работал поверх файловой системы.

    Сегодня приду домой попробую на уровень "block device". Там буфера ОС точно нелетают.
    6 мар 19, 16:19    [21826493]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Несколько наблюдений по чтению из сети.

    Получатель - новый диск на 64-битной семерке (локальный), скорость записи значительно превышает скорость чтения.
    Сетка - гигабит через убиквити едж свитч.
    Источник - тот же самый 2003 сервак с зеркалом на LSI контроллере.
    копируется группа из 8 файлов от 24 МБ до 3 ГБ. Общий размер - 8 ГБ.

    Изначально, при курении MSDN я пришел к следующему выводу: флаги (используемые при открытии файла на чтение) FILE_FLAG_NO_BUFFERING и FILE_FLAG_SEQUENTIAL_SCAN взаимно исключающие. То есть, даже если их указать вместе, работать будет только один из них. Вывод логичный, поскольку один флаг полностью отменяет буферизацию, а второй - управляет ею. Увидел в интернетах, что кто-то использует их вместе, решил поэкспериментировать. Мало ли, если винда по каким-то причинам не может применить один флаг, она попытается применить другой? Нет.

    FILE_FLAG_SEQUENTIAL_SCAN - скорость 100 МБ в сек, размер блока большого значения не имеет. Лучшие значения - 8 и 16 МБ.

    FILE_FLAG_NO_BUFFERING - скорость от 50 до 60 МБ в сек.

    FILE_FLAG_NO_BUFFERING и FILE_FLAG_SEQUENTIAL_SCAN - скорость от 50 до 60 МБ в сек.

    FILE_ATTRIBUTE_NORMAL без всякой оптимизации - 100 МБ в сек. Проигрывает FILE_FLAG_SEQUENTIAL_SCAN буквально на два процента и то не факт. Статистики мало.

    Отсюда выводы:

    1. FILE_FLAG_NO_BUFFERING по локалке может навредить почти в два раза.

    2. Не надо надеяться на винду и подсовывать ей все возможные варианты оптимизации. Надо самому убедиться, что ты читаешь из сети и применять FILE_FLAG_SEQUENTIAL_SCAN, он по крайней мере не помешает.

    Еще одно замечание. Если в группу файлов включить файл 25 ГБ, скорость падает до 30-40 МБ в сек. Никакие флаги не помогают. Кто тут больше виноват, Microsoft или LSI, пока не ясно.
    11 мар 19, 13:52    [21829149]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    А при чтении с 2008 сервера все лучше.
    FILE_FLAG_NO_BUFFERING дает прирост в 4%.
    проблем с файлами больше 4 ГБ не наблюдается.
    11 мар 19, 16:49    [21829456]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Не забывай про чистое время копирования + отмонтирование флешки.
    11 мар 19, 16:59    [21829474]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Было бы неплохо узнать, какие флаги были реально применены виндой при создании файла.
    Типа, говоришь ей: FILE_FLAG_NO_BUFFERING, а она тебе в ответ: "Нифига, попробуй другой вариант".
    11 мар 19, 17:00    [21829475]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Не забывай про чистое время копирования + отмонтирование флешки.

    Да я помню. Это все также связано с буферизацией. Даже провел опыт, когда под рукой был ноут с десяткой. Скопировал файлы своей прогой, будучи уверен, что буферизация отключена. Потом скопировал файлы виндовым проводником и выдернул флэшку сразу после завершения операции. Все файлы на флэшке оказались целыми. Значит, десятка при копировании на флэшку буферизацию не использует. Скорее всего.
    Да, и по скорости я ничего не выиграл.

    Когда файлов много, к чистому времени копирования еще прибавляется время, затраченное на расчет общего размера с "кластерными хвостами". И еще надо тратить время на расчет так называемых "секторных хвостов" для безбуферных операций.
    11 мар 19, 17:18    [21829499]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    А кто-нибудь видел своими глазами скорость копирования по сети 100 мегабайт в секунду?
    Я вчера увидел и немного офигел. Правда, до этого я и не задавался этими вопросами.
    Это 0.8 гигабита в секунду, близко к пропускной способности гигабитной сетки. А может, и на пределе. Сколько там служебных байт надо самбе для передачи файла?
    ЗЫ размер блока - 32 МБ.
    15 мар 19, 08:16    [21833242]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Flying-home
    А кто-нибудь видел своими глазами скорость копирования по сети 100 мегабайт в секунду?

    + Почти 100
    Картинка с другого сайта.
    15 мар 19, 08:28    [21833254]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Наверное, пора создавать блог и писать туда мысли по поводу сабжа и вообще копирования файлов.

    Мысль первая:
    Для того, чтобы быстро копировать, надо сделать три вещи:
    1. Быстро читать
    2. Быстро писать
    3. Не давать медленной операции простаивать.

    Первые два пункта решаются сравнительно просто, надо установить правильные флаги в функции CreateFile.

    На третьем начинаются танцы. Если чтение и запись ведутся последовательно, ничего не сделаешь. Если параллельно - надо сделать упреждающее чтение. Но оно не поможет, если скорость чтения ощутимо меньше скорости записи. И получится, что ты напрасно выделил память под буфер А сравнить эти скорости можно только начав процесс копирования.
    15 мар 19, 08:36    [21833258]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Dima T
    Flying-home
    А кто-нибудь видел своими глазами скорость копирования по сети 100 мегабайт в секунду?

    + Почти 100
    Картинка с другого сайта.

    Точно! Надо будет еще и с Фаром посоревноваться.
    А можно поинтересоваться, в каком окружении эта скорость была установлена? Какие винты и контроллеры на сервере и на клиенте?
    15 мар 19, 08:40    [21833262]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Flying-home
    Это 0.8 гигабита в секунду, близко к пропускной способности гигабитной сетки. А может, и на пределе. Сколько там служебных байт надо самбе для передачи файла?

    Гигабит это 2^30 бит/сек или 2^27 байт/сек или 128 Мб/сек. При копировании большого файла служебной инфы менее 1%, т.е. предельная скорость должна быть около 125 Мб/сек.
    15 мар 19, 08:42    [21833263]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Flying-home
    Dima T
    пропущено...

    + Почти 100
    Картинка с другого сайта.

    Точно! Надо будет еще и с Фаром посоревноваться.
    А можно поинтересоваться, в каком окружении эта скорость была установлена? Какие винты и контроллеры на сервере и на клиенте?

    Cервер SSD, клиент обычный HDD. Сетевухи встроенные. Роутер Zyxel Keenetic Ultra
    15 мар 19, 08:47    [21833269]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    + С сервера на клиента без сохранения на диск 109 Мб/сек
    Картинка с другого сайта.
    15 мар 19, 08:55    [21833274]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Dima T
    + С сервера на клиента без сохранения на диск 109 Мб/сек
    Картинка с другого сайта.

    "Без сохранения на диск" - это как? Чистая скорость чтения?
    15 мар 19, 10:42    [21833390]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    А какой версией Фара пользуются благородные доны?
    15 мар 19, 10:44    [21833392]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Flying-home
    Dima T
    + С сервера на клиента без сохранения на диск 109 Мб/сек
    Картинка с другого сайта.

    "Без сохранения на диск" - это как? Чистая скорость чтения?

    Вместо пути куда пишешь nul, т.е. дословно "в никуда".
    15 мар 19, 10:48    [21833398]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Flying-home
    А какой версией Фара пользуются благородные доны?

    Древняя, 2003 год: The FAR manager, version 1.70 beta 5 (build 1634)

    Есть посвежее: Far Manager, version 3.0 (build 4949) x64. В ней 113.2 Мб/сек копирование в nul
    15 мар 19, 10:52    [21833405]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Dima T
    Flying-home
    А какой версией Фара пользуются благородные доны?

    Древняя, 2003 год: The FAR manager, version 1.70 beta 5 (build 1634)

    Есть посвежее: Far Manager, version 3.0 (build 4949) x64. В ней 113.2 Мб/сек копирование в nul

    А у него есть какие-то настройки копирования? Или алгоритм полностью универсальный?
    В ТоталКоммандере есть:

    К сообщению приложен файл. Размер - 98Kb
    15 мар 19, 13:07    [21833673]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Flying-home
    А у него есть какие-то настройки копирования? Или алгоритм полностью универсальный?

    Там из всех настроек одна галка "Use system copy routine" и она стоит. Т.е. использет виндовые средства. Вот топик по этому вопросу

    Попробовал галку снять - скорость упала со 113 до 87 Мб/с
    15 мар 19, 14:29    [21833878]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    вадя
    Member

    Откуда: Екатеринбург
    Сообщений: 15273
    есть ещё прога teracopy http://codesector.com/teracopy , хорошо и быстро копирует, да ещё и может проверить скопированное.
    16 мар 19, 09:01    [21834483]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    вадя
    есть ещё прога teracopy http://codesector.com/teracopy , хорошо и быстро копирует, да ещё и может проверить скопированное.

    Посмотрим.
    17 мар 19, 23:54    [21835477]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Ситуация:
    Копируем файлы с жесткого диска на SSD.
    Скорость записи SSD заметно выше скорости чтения HDD, операции чтения на простаивают.
    Все файлы небольшие, от 200 КБ до 19 МБ, 600 штук
    Чтение безбуферное.

    В первом случае читаются блоками по 2 МБ, в блок больше одного файла не читается.
    Количество чтений - 1694

    Во втором случае читаются блоками по 32 МБ, в блок может быть прочитано несколько файлов.
    Количество чтений - 683

    В обоих случаях остановок (пауз между операциями чтения) нет. Почему второй метод проигрывает 2% по скорости?

    Если объем файлов увеличить в два раза, то и разница во времени копирования увеличивается в два раза.

    Если скопировать эти файлы на тот же диск так, чтобы их фрагментация уменьшилась, то в обоих случаях скорость возрастает, но первый метод выигрывает те же 2%.
    18 мар 19, 00:04    [21835484]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Ты в эксперимент внёс ещё несколько неизвестных.

    Когда копируешь 1 большой файл то можно достичь
    Пропускной скорости диска.

    Когда копируешь россыпь мелких то читающий
    И пишущий диски начинают роутинг дискового каталога. А это движение по древовидными
    Структурам. В игру включаются seek вызовы
    И это сбивает основной алгоритм.
    18 мар 19, 00:10    [21835489]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Flying-home
    В обоих случаях остановок (пауз между операциями чтения) нет. Почему второй метод проигрывает 2% по скорости?

    ИМХО большим блоком ты мешаешь каким-то фоновым оптимизациям внутри ОС. Например упреждающее чтение: прочитав маленький блок, пока ты пишешь - ОС готовит тебе следующий блок, а при большом блоке ты тупо ждешь пока ОС тебе его прочитает.
    При записи тоже есть нечто подобное.

    1. Уменьши блок до 32-64 Кб.
    2. Замерь скорость встроенных средств: CopyFile() CopyFileEx()
    18 мар 19, 08:35    [21835573]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    вадя
    есть ещё прога teracopy http://codesector.com/teracopy , хорошо и быстро копирует, да ещё и может проверить скопированное.

    Школьная поделка.
    Сходу проиграла мне 7%. 13 файлов, общий объем 8.5 ГБ. Мое время - 155 сек, ее - 167 (по ее данным).
    18 мар 19, 10:23    [21835639]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Ты в эксперимент внёс ещё несколько неизвестных.

    Когда копируешь 1 большой файл то можно достичь
    Пропускной скорости диска.

    Когда копируешь россыпь мелких то читающий
    И пишущий диски начинают роутинг дискового каталога. А это движение по древовидными
    Структурам. В игру включаются seek вызовы
    И это сбивает основной алгоритм.


    Размер блока в данном случае не имеет значения.
    В первом случае я читаю 4-метровый файл за два последовательных прохода, которые, скорее всего, винчестер объединяет.
    Во втором случае я читаю 4-метровый файл за один проход.
    18 мар 19, 10:28    [21835642]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Dima T
    Flying-home
    В обоих случаях остановок (пауз между операциями чтения) нет. Почему второй метод проигрывает 2% по скорости?

    ИМХО большим блоком ты мешаешь каким-то фоновым оптимизациям внутри ОС. Например упреждающее чтение: прочитав маленький блок, пока ты пишешь - ОС готовит тебе следующий блок, а при большом блоке ты тупо ждешь пока ОС тебе его прочитает.
    При записи тоже есть нечто подобное.

    1. Уменьши блок до 32-64 Кб.
    2. Замерь скорость встроенных средств: CopyFile() CopyFileEx()

    Это все справедливо для буферизированных операций. У меня чтение безбуферное, ось мне ничего не готовит.
    Виндовые функции копирования CopyFile() и CopyFileEx() уже давно курят в сторонке.
    18 мар 19, 10:31    [21835647]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Почитай про IoCompletionPort. У Рихтера неплохо было написано про него в "Windows via C/C++".
    18 мар 19, 10:42    [21835659]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Dima T
    Почитай про IoCompletionPort. У Рихтера неплохо было написано про него в "Windows via C/C++".

    Уже было предложено и было мной прочитано.
    18 мар 19, 11:43    [21835727]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Хотел бы в двух словах описать (как я это понимаю), как происходят безбуферные дисковые операции, чтобы исключить в дальнейшем предложения уменьшить размер буфера до 64К.

    Что у Рихтера на эту тему

    Виндовс, когда видит, что файл создан (или открыт) с флагом FILE_FLAG_NO_BUFFERING, делает две вещи: отменяет собственную буферизацию и говорит винчестеру, что хочет, чтобы он читал данные посекторно.
    Так вот, если винчестер это понимает и может, если файл (или свободное пространство, если речь идет о записи) несильно фрагментированы, ты мы можем получить прирост скорости операции до 50%. Пример такого прироста мы видим в работе ФАРа (несколько постов выше). Для таких операций (при достаточно больших файлах) размер блока должен быть побольше. Из моих наблюдений скорость операций перестает расти после 16, 32 и 64 МБ. Интересно, что этот механизм работает и по сети.

    Я не занимаюсь копированием файлов размером меньше 128 КБ, выделяю их копирование в отдельную задачу и использую CopyFile(). Получается быстрее, чем если копировать их вместе с большими файлами. Это потому что создание файла в файловой системе занимает больше времени, чем запись в него. Так же при создании файла головки винчестера делают лишние телодвижения для работы с MFT.

    Но с файлами размером 2 МБ приходится возиться.

    Почему я вообще этим занялся: из всех копировалок, которые я видел, ни одна не копировала бесшовно. И ни одна не пыталась использовать побольше памяти для упреждающего чтения. Я решил, что смогу на этих двух пунктах выиграть и уже выигрываю.
    Бесшовно - значит без паузы межу файлами. К тому времени, когда пишущий поток закрывает очередной записанный файл, читающий поток уже должен прочитать ему первый блок следующего файла.
    18 мар 19, 12:12    [21835765]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Flying-home
    Это потому что создание файла в файловой системе занимает больше времени, чем запись в него. Так же при создании файла головки винчестера делают лишние телодвижения для работы с MFT.

    Я добавлю что в старых файловых системах (FAT32 для дискет и флешек) каталог с файлами
    представляет собой несортированный список. И когда количество файлов превышает за тыщу
    вы испытываете ощутимый тормоз при добавлении нового файла.

    Если отформатировать флешку на ExFat или NTFS тогда этот эффект нивелируется но возможно
    будут новые более сложные эффекты которые не всегда можно спрогнозировать. В целом
    MS рекомендует делать ExFat и я-бы сказал что глупо спорить. Есть табличка.
    http://www.ntfs.com/ntfs_vs_fat.htm где можно почитать про некоторые сравнительные фичи.
    18 мар 19, 12:24    [21835784]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13367
    Свежая статья на похожую тему https://habr.com/ru/post/444036/
    18 мар 19, 13:44    [21835921]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Вот иллюстрация к тому, что я говорил выше.
    Это копирование кучи mp3-шек в сеть.

    кол-во файлов кол-во блоков размер блока общий размер (байт) миллисекунды КБ/С МБ/С
    552 27 16 777 216 4 690 054 068 0 51 870 88 300.19 86.23
    552 15 33 554 432 4 690 054 068 0 48 298 94 830.65 92.61
    552 7 67 108 864 4 690 054 068 0 47 767 95 884.84 93.64
    TeraCopy4 690 054 068 77 000 59 482.22 58.09

    Самый большой файл - 40 МБ, средний размер - 8 МБ.
    Как видим, для безбуферных операций главная задача - уменьшить количество чтений/записи. А дальше уже вся надежда на винчестер и фрагментированность файлов / свободного места.
    18 мар 19, 15:32    [21836113]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Flying-home
    Это потому что создание файла в файловой системе занимает больше времени, чем запись в него. Так же при создании файла головки винчестера делают лишние телодвижения для работы с MFT.

    Я добавлю что в старых файловых системах (FAT32 для дискет и флешек) каталог с файлами
    представляет собой несортированный список. И когда количество файлов превышает за тыщу
    вы испытываете ощутимый тормоз при добавлении нового файла.

    Если отформатировать флешку на ExFat или NTFS тогда этот эффект нивелируется но возможно
    будут новые более сложные эффекты которые не всегда можно спрогнозировать. В целом
    MS рекомендует делать ExFat и я-бы сказал что глупо спорить. Есть табличка.
    http://www.ntfs.com/ntfs_vs_fat.htm где можно почитать про некоторые сравнительные фичи.


    Был промежуток времени, когда я не знал о существовании ExFat, а хранить большие файлы на флэшках уже надо было. Форматировал в NTFS, обманывая винду (отключая кэширование в свойствах съемного накопителя и форматируя из командной строки).
    А потом узнал про ExFat далеко-далеко от цивилизации, в лесу, с Экспишкой на ноуте. Надо было срочно скопировать данные с карточки на диск. А Экспишка просто так ExFat не понимает. Я вышел из положения. На ноуте стояла RStudio, которая понимала ExFat.
    :)

    NTFS для флэшек не менее жесток, чем FAT32. Там куча операций с MFT, а она хранится в одном месте.
    18 мар 19, 15:40    [21836129]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    У этой ТераКопи совершенно непродуманный ГУИ. Надо внедряться в контекстное меню проводника и добавлять меню вставки файлов рядом со стандартной вставкой. Типа "Вставить используя ТераКопи". А дальше анализировать содержимое буфера обмена и запускать процесс копирования. Я себе именно так и сделаю.
    18 мар 19, 17:05    [21836278]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Еще два наблюдения:

    Собирать статистику скорости копирования в зависимости от параметров надо аккуратно и осмотрительно: например, копировать всегда в одно и тоже место диска.
    Вчера сливал все скачанные с торрентов киношки с нескольких дисков на один терабайтник. В начале скорость была 138 МБ/с, запись обгоняла чтение. В конце скорость снизилась до 85 МБ/с, чтение стало обгонять запись.
    Терабайтник одноблиновый, так что все понятно.

    Для чтения с компакт или DVD диска файлы надо читать в том порядке, в котором они записаны на диск. Как это сделать? Как получить полный список файлов на диске, отсортированный в нужном порядке? И сколько времени займет получение этого списка? А если файлов много, а пользователь копирует только часть из них?
    21 мар 19, 10:21    [21839217]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Flying-home
    Для чтения с компакт или DVD диска файлы надо читать в том порядке, в котором они записаны на диск. Как это сделать? Как получить полный список файлов на диске, отсортированный в нужном порядке? И сколько времени займет получение этого списка? А если файлов много, а пользователь копирует только часть из них?

    Какой у нас есть Api для DVD? Это тот-же самый файловый итератор findfirst/findnext для unix, FindFirstFile/FindNextFile для Windows.
    И я не очень понимаю о какой сортировке идет речь. Предполагаю что в том порядке как выдает итератор так и надо
    обрабатывать. Optimal way.

    Альтернативный API - это копировать образ диска. Но это КМК другая задача.
    21 мар 19, 11:19    [21839322]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Flying-home
    Еще два наблюдения:

    Собирать статистику скорости копирования в зависимости от параметров надо аккуратно и осмотрительно: например, копировать всегда в одно и тоже место диска.
    Вчера сливал все скачанные с торрентов киношки с нескольких дисков на один терабайтник. В начале скорость была 138 МБ/с, запись обгоняла чтение. В конце скорость снизилась до 85 МБ/с, чтение стало обгонять запись.
    Терабайтник одноблиновый, так что все понятно.

    Да. Лет 10 назад была такая утилитка. HDTune. И она графиками подтверждает этот факт.

    Картинка с другого сайта.
    21 мар 19, 12:01    [21839394]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    tunknown
    Flying-home
    Цель - максимальная скорость.
    Если речь идёт только о флеше, то кроме высокоуровневых вещей нужно не забыть и низкоуровневые:
    Форматирование флешевых накопителей с выравниванием кластера на границу блока

    Помучил эту тему. Более-менее вменяемый мануал нашел аж на 56 странице.

    Есть две флэшки, на которые каждый день записываются большие файлы общим объемом 30 ГБ.
    Одна была отформатирована ExFAT с размером кластера 8 МБ (файлы-то большие, чего мелочиться)
    Вторая - ExFAT с размером кластера 32 МБ.
    Средняя скорость записи на обе флэшки - 22.8 МБ/с на одном компе и 23.2 МБ/c на другом. Думаю, разница в USB контроллерах. Запись безбуферная, блоками по 8 - 32 МБ.

    Взял одну, проверил по предложенной методике. Обнаружил смещение, повозился с BOOTICE, избавился от смещения, отформатировал в ExFAT с размером кластера 32 КБ. Окончательный тест DFB показал скорость записи не меньше 56 МБ/с.
    Чем и как ни пробовал, реальная скорость записи осталась прежней, 23 МБ/с.
    Виндой, ТоталКоммандером, своей прогой с разными параметрами.

    Интересно, как у DFB организована запись? Где он взял такие цифры?
    вчера, 17:24    [21841146]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    И я не очень понимаю о какой сортировке идет речь

    Ну как, на компакт-диске всего одна дорожка. Для оптимального чтения надо сделать так, чтобы каретка с лазером двигалась вдоль дорожки и делала минимум переходов туда-сюда. А FindFirst/FindNext в каком порядке нам список файлов даст?
    вчера, 17:29    [21841155]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Flying-home
    mayton
    И я не очень понимаю о какой сортировке идет речь

    Ну как, на компакт-диске всего одна дорожка. Для оптимального чтения надо сделать так, чтобы каретка с лазером двигалась вдоль дорожки и делала минимум переходов туда-сюда. А FindFirst/FindNext в каком порядке нам список файлов даст?

    Я понимаю откуда идёт твой вопрос.

    Надо почитать устройство компакт-диска. Стандарт DVD/BlueRay. Я думаю - закопаешся на пару месяцев.
    Вангую что не будет практической пользы от ответа который ты найдешь.
    вчера, 17:34    [21841169]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Flying-home
    надо сделать так, чтобы каретка с лазером двигалась вдоль дорожки и делала минимум переходов туда-сюда

    А для этого надо читать файлы в том порядке, в котором они находятся на этой самой дорожке.
    вчера, 17:35    [21841172]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Flying-home
    пропущено...

    Ну как, на компакт-диске всего одна дорожка. Для оптимального чтения надо сделать так, чтобы каретка с лазером двигалась вдоль дорожки и делала минимум переходов туда-сюда. А FindFirst/FindNext в каком порядке нам список файлов даст?

    Я понимаю откуда идёт твой вопрос.

    Надо почитать устройство компакт-диска. Стандарт DVD/BlueRay. Я думаю - закопаешся на пару месяцев.
    Вангую что не будет практической пользы от ответа который ты найдешь.

    Да уж. Перфекционизм он такой.
    вчера, 17:36    [21841177]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 39264
    Из далеких двухтысячных. Я помню что копирование CD на 700 мб. занимало много времени
    когда в диске было дохрена мелких файлов. Спасали утилиты типа DaemonTools e.t.c.
    Они позволяли копировать образ диска.

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

    Очень сомнительно что ты создашь системную утилиту копирования дисков. Это
    поле уже испахано. А даже если и создашь то никто за нее не заплатит. Вообще..
    кто платит за разработку системного софта?

    Вот за прикладной - платят.
    вчера, 18:08    [21841239]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    Flying-home
    +
    tunknown
    пропущено...
    Если речь идёт только о флеше, то кроме высокоуровневых вещей нужно не забыть и низкоуровневые:
    Форматирование флешевых накопителей с выравниванием кластера на границу блока

    Помучил эту тему. Более-менее вменяемый мануал нашел аж на 56 странице.

    Есть две флэшки, на которые каждый день записываются большие файлы общим объемом 30 ГБ.
    Одна была отформатирована ExFAT с размером кластера 8 МБ (файлы-то большие, чего мелочиться)
    Вторая - ExFAT с размером кластера 32 МБ.
    Средняя скорость записи на обе флэшки - 22.8 МБ/с на одном компе и 23.2 МБ/c на другом. Думаю, разница в USB контроллерах. Запись безбуферная, блоками по 8 - 32 МБ.

    Взял одну, проверил по предложенной методике. Обнаружил смещение, повозился с BOOTICE, избавился от смещения, отформатировал в ExFAT с размером кластера 32 КБ. Окончательный тест DFB показал скорость записи не меньше 56 МБ/с.
    Чем и как ни пробовал, реальная скорость записи осталась прежней, 23 МБ/с.
    Виндой, ТоталКоммандером, своей прогой с разными параметрами.

    Интересно, как у DFB организована запись? Где он взял такие цифры?

    Кажется, я понял. Я упираюсь в пропускную способность USB контроллера. А у DFB блоки, которыми он тестирует запись, настолько маленькие, и их так мало, что... Непонятно что.
    вчера, 18:11    [21841241]     Ответить | Цитировать Сообщить модератору
     Re: Оптимальный размер блока при записи файла на флэшку  [new]
    Flying-home
    Member

    Откуда: nas.vrostove.net
    Сообщений: 14260
    mayton
    Из далеких двухтысячных. Я помню что копирование CD на 700 мб. занимало много времени
    когда в диске было дохрена мелких файлов. Спасали утилиты типа DaemonTools e.t.c.
    Они позволяли копировать образ диска.

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

    Очень сомнительно что ты создашь системную утилиту копирования дисков. Это
    поле уже испахано. А даже если и создашь то никто за нее не заплатит. Вообще..
    кто платит за разработку системного софта?

    Вот за прикладной - платят.

    Да понятно. Если и буду копать в эту сторону, то не скоро.
    вчера, 18:12    [21841244]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
    Все форумы / Windows Ответить