|
|
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Flying-homeУ меня на 40 МБ перестала расти. Может, у меня какой-то не общий случай, может с размерами файлов какая-то коллизия произошла, надо будет еще посмотреть. С алгоритмом у тебя коллизия скорее всего произошла. На 40 мегабайтах разница по времени между логической записью в кэш и физическим обменом с флэшкой стала достаточной для того, чтобы следующий блок успел прочитаться с винта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2019, 15:05 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovFlying-homeУ меня на 40 МБ перестала расти. Может, у меня какой-то не общий случай, может с размерами файлов какая-то коллизия произошла, надо будет еще посмотреть. С алгоритмом у тебя коллизия скорее всего произошла. На 40 мегабайтах разница по времени между логической записью в кэш и физическим обменом с флэшкой стала достаточной для того, чтобы следующий блок успел прочитаться с винта. Я еще до флэшки не дошел, пока только с сата винчестерами балуюсь. И до FILE_FLAG_NO_BUFFERING тоже еще не добрался. Рихтера уже начал читать. Очень доходчиво пишет, респект ему. Чтобы было с чем сравнивать, я сделал эталон: Использую виндовый буфер, применяю FILE_FLAG_SEQUENTIAL_SCAN, принудительно сбрасываю буфера по очереди после того, как вся группа файлов формально скопируется. Недостаток этого метода в том, что винда сбрасывает буфера когда захочет и делает это параллельно, это заметно снижает скорость записи на диск. Тут я ничего поделать не могу. Алгоритм копирования тут особого значения не имеет, поскольку запись идет всегда в память и начинает задерживаться только когда буфер переполняется. С этим эталоном я сравниваю свой алгоритм: Чтение с использованием буфера, запись - "через буфер" (FILE_FLAG_WRITE_THROUGH) алгоритм для одного жесткого диска - один поток, один блок, для разных дисков - два потока, два блока. Играю размерами блоков, вижу, что чем больше, тем лучше. 64 МБ - самое то. У эталона выигрываю 8% на одном диске и 15% на разных дисках. Это я сделал, потому что думал, что винда правильно и качественно сбрасывает буфера. Кто ей мешает, например, использовать для этого тот же алгоритм, что и в FILE_FLAG_NO_BUFFERING, и делать все последовательно? Но нет. Пока еще у меня все сырое, но буду держать вас в курсе. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 14:22 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Набросал тут мысли по поводу: Что зависит от программиста: Алгоритм копирования: один поток, один блок (полезно для копирования на тот же диск) два потока, несколько блоков (для копирования на другой диск) Соответственно, можно играть с размерками блоков и их количеством. Можно копировать файлы с помощью соответствующего виндового диалога Способы открытия файлов: для чтения: с буфером, без буфера для записи: с буфером, "через буфер", без буфера Для вариантов с буфером полезен флаг FILE_FLAG_SEQUENTIAL_SCAN, при использовании буфера можно принудительно сбрасывать буфера на диск, можно не сбрасывать. Специфика окружения, от которой может зависеть выбор алгоритма и способа открытия файлов: Источник и целевой файлы могут находиться на одном физическом носителе на разных носителях Источник и целевой файлы могут находиться на жестком диске на твердотельном накопителе на RAID массиве на компакт, DVD диске на съемном флэш-накопителе (для которого винда либо включила буферизацию, либо нет) в локальной сети на подключенном к компьютеру смартфоне (носители которого либо распознаются системой как диски, либо нет) Носители могут иметь различные файловые системы размеры сектора размеры кластера Про сектора наверное, можно забыть и оперировать только размерами кластера (подгонять под них размеры блоков) Продвинутость пользователя Одного пользователя можно ненавязчиво спросить, расположены ли C:\ и D:\ на одном HDD, другого - нельзя. Ограничения операционной системы Еще не пробовал, но кажется, програмная попытка получить ответ на предыдущий вопрос под ограниченным в правах пользователем с включенным УАКом может потерпеть крах и / или испугать пользователя. Тоже самое с попыткой выяснить размер кластера и количество свободного места на диске (предполагаю) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 14:32 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Забыл сказать, что при копировании двумя потоками у меня упреждающее чтение работает и между файлами. То есть, когда записывающий поток заканчивает с одним файлом, читающий уже начинает со следующим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 14:46 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
И еще я пока не вижу преимуществ overlapped I/O. Если у меня и так все длительные операции в отдельных потоках и у пользователя ГУИ не тормозит, зачем он может быть нужен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 14:54 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
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.01.2019, 16:54 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevмне кажется 64 Mb тут сильно лишнее. А чем плохо? Только тем, что перед копированием надо узнать, сколько некэшируемой оперативки может выделить система приложению? Может, действительно, три блока по 64 МБ будет тяжело? Leonid KudryavtsevЕсли у тебя 2-3 потока - то все нормально, а если 200-300 потоков, то тогда уже на переключении потоков будет overhead. У меня всего 2 потока. Зачем больше? Для упреждающего чтения достаточно количество блоков увеличить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 18:36 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
А, кстати. Рихтер пишет, что для выделения блоков использует VirtualAlloc, потому что так данные выравниваются в памяти правильно. А что, обычный GetMem не будет выравнивать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 18:39 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Flying-homeна компакт, DVD диске Интерсно, как лучше с них читать? Думаю, с обычной буферизацией. Flying-homeна подключенном к компьютеру смартфоне (носители которого либо распознаются системой как диски, либо нет) А кто-нибудь сталкивался с подобной задачей? Последние Андроиды как правило, не дают системе нормально примонтировать свои носители. Но в проводнике они видны (не как диски) и копировать файлы туда-сюда все-таки можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 18:46 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Что самое смешное, что большинству пользователей вся эта оптимизация нафиг не нужна. Я, например, много лет назад заглянул в настройки Тоталкоммандера, увидел там разные размеры блока для одного и двух дисков, сказал "Ого", оставил все как есть и больше эти настройки не открывал. А теперь я копирую быстрее него. Как мне кажется, у Джислера во всех случаях однопоточное копирование. По крайней мере в шестой версии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 18:58 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Эту тему можно переносить в Windows. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2019, 21:35 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Flying-homeИ еще я пока не вижу преимуществ overlapped I/O. Если у меня и так все длительные операции в отдельных потоках и у пользователя ГУИ не тормозит, зачем он может быть нужен? Overlapped I/O нужна для того чтобы НЕ использовать потоки. Это древняя технология, появившаяся ещё до многопоточности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2019, 15:13 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Flying-home, почитай про "Порт завершения ввода/вывода" IO Completion Port ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2019, 15:32 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovFlying-homeИ еще я пока не вижу преимуществ overlapped I/O. Если у меня и так все длительные операции в отдельных потоках и у пользователя ГУИ не тормозит, зачем он может быть нужен? Overlapped I/O нужна для того чтобы НЕ использовать потоки. Это древняя технология, появившаяся ещё до многопоточности.да вроде одинаково они появились, иначе было просто нельзя мультимедиа и прочее фоновое поддерживать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2019, 16:07 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
maytonЭту тему можно переносить в Windows. Windows - подраздел "Администрирования". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2019, 14:23 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Разные тонкости: При чтении файла открытого с флагом FILE_FLAG_NO_BUFFERING параметр nNumberOfBytesToRead всегда надо указывать кратным размеру сектора. Даже в конце файла, когда известно, что прочитано будет меньше. Возникло ощущение, что VirtualAlloc с флагом PAGE_NOCACHE замедляет работу. Пока еще не придумал, как поточнее замерить потери. А в какой момент винда решает, что страницы можно начинать кэшировать? Если со страницами постоянно идет работа, она подождет? Модератор: Тема перенесена из форума "Программирование". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2019, 14:26 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Еще одна проблемка всплыла. Как узнать размер кластера на дисках: 1. каталоги которых подключены через хардлинк. 2. которые монтированы как NTFS папки других дисков. Функции GetDiskFreeSpace надо указывать корень диска да и сомнительная она, функции GetDiskFreeSpaceEx можно указывать каталог, но она не не показывает размер кластера. Открывать диск функцией CreateFile не хочется, надо повышать права. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 09:58 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Посмотри fsutil ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 10:49 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
maytonПосмотри fsutil Ее может не быть на клиентском компе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 13:05 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Flying-homeЕще одна проблемка всплыла. Как узнать размер кластера на дисках: 1. каталоги которых подключены через хардлинк. 2. которые монтированы как NTFS папки других дисков. Функции GetDiskFreeSpace надо указывать корень диска да и сомнительная она, функции GetDiskFreeSpaceEx можно указывать каталог, но она не не показывает размер кластера. Открывать диск функцией CreateFile не хочется, надо повышать права.1. хардлинк может быть только на этот же том 2. это софтлинк, общего механизма нет, в общем случае драйвер может послать куда угодно взять данные откуда угодно, даже виртуальные файлы "придумать" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 13:11 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Flying-homemaytonПосмотри fsutil Ее может не быть на клиентском компе. Эта утилита использует API который тебе нужен. Типа fsutil fsinfo ntfsinfo [drive] Или поищи сорцы или описание у Рихтера или Руссиновича. Полюбому они должны были пройтись краями по этой теме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 14:11 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
maytonFlying-homeпропущено... Ее может не быть на клиентском компе. Эта утилита использует API который тебе нужен. Типа fsutil fsinfo ntfsinfo [drive] Или поищи сорцы или описание у Рихтера или Руссиновича. Полюбому они должны были пройтись краями по этой теме. Угу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 14:39 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)1. хардлинк может быть только на этот же том Да. Я имел в виду junction points ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 15:16 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Если все делать правильно, то надо отказываться от GetDiskFreeSpace. Использовать DeviceIoControl с операцией IOCTL_DISK_GET_DRIVE_GEOMETRY Эта функция требует хэндл диска, открытого с помощью CreateFile, что в свою очередь требует повышения прав. По поводу симлинков: наверное, придется проверять каждую папку в пути на то, не является ли она ссылкой, и если является, смотреть, куда она указывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 15:53 |
|
||
|
Оптимальный размер блока при записи файла на флэшку
|
|||
|---|---|---|---|
|
#18+
Может, можно обойтись меньшей кровью? Без повышения прав? Задачи-то простые. 1. Есть файл, доступный для чтения. Теоретически доступа к корню диска, на котором он расположен, может не быть. Диск может быть компакт-диском. Надо узнать размер кластера файловой системы диска. 2. Есть каталог, в который предстоит писать файлы. Права на запись в каталог есть. Доступа к корню диска может не быть. Опять же, надо узнать размер кластера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2019, 16:09 |
|
||
|
|

start [/forum/topic.php?fid=26&msg=39766990&tid=1492230]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 513ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...