Что нового

Переделать часть кода с С++ на autoit

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Доброго времени суток. К сожалению последнее время вообще не до программирования ни в каком виде. И то, что знал и вроде как использовал, тоже забывается. Сейчас вроде как и появилось время, но его явно не хватит на все мои хотелки. А очень бы хотелось разобраться со старым вопросом: сделать диагностику винтов на autoit. Есть куча программ, которые это делают и делают хорошо. Но так получилось, что Си/С++ не учил, а чтобы что-то программировать в винде, начал именно с autoit. Года два назад кое-что у меня получилось, но потом застопорился на ssd дисках и DeviceIOControl, а потом появились другие проблемы в жизни. А хотелка осталась.
Есть две программы с открытым кодом на Си/С++. Не могу сказать точно на чем именно. Это Cristal Disk Info и Cristal Disk Mark. Обе лежат на гитхабе.
Cristal Disk Info
и
Cristal Disk Mark
Хотелось бы увидеть часть их кода, реализованную на autoit.
Из Кристал Диск ИНфо хотелось бы понять, как определяют версию контроллера и остальные параметры. Причем, как я понял, для каждого винта есть своя вариация. Видимо связано с разной реализацией контроллера диска. Мне достаточно вывод в таблице без GUi. Возможно кому то для этого понадобиться справочник по DeviceIOControl работе с дисками. Вот он
А из Кристал диск марк хотелось бы понять, как там делают "виртуальное копирование".
С удовольствием бы заплатил, но в связи с обстановкой в стране мои деньги скорее всего не дойдут до исполнителя. Поэтому и размещаю тут.
 

Prog

Продвинутый
Сообщения
484
Репутация
57
Cristal Disk Info и Cristal Disk Mark.
Маловероятно что кто-то будет переписывать их на AutoIt. Слишком много кода придется переписать...
У меня есть приложение на PureBasic считывающие информацию о диске в том числе смарт. В его исходном коде разобраться должно быть проще. Посмотрите, может найдете ответы на свои вопросы.

А из Кристал диск марк хотелось бы понять, как там делают "виртуальное копирование".
О каком виртуальном копировании идет речь? Приложение читает и записывает данные на диск.
 

Вложения

  • HDDInfo.zip
    295.8 КБ · Просмотры: 5

Glass4217

Продвинутый
Сообщения
290
Репутация
53
Добрый день. Так же есть уже аналогичное решение возможно вам это поможет.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Добрый день. Так же есть уже аналогичное решение возможно вам это поможет
Эта тема когда-то помогла мне разобраться в некоторых вещах ))) Ещё в 2020 я там написал последнее сообщение в теме с теми моментами, которые хотел уточнить. К сожалению автор забросил проект. Но даже я продвинулся дальше и сделал больше ))) Исправил некоторые его ошибки, в том числе с определением температуры. Но главное, я понял, что нужно идти по другому пути. Он использовал WMI. Но я в нем не нашел инструмента для работы с NVME дисками. А вот DeviceIOControl дает такую возможность.
Честно говоря, если бы я успел, как и планировал, осилить Си/С++, то думаю и сам бы справился. НО это минимум год. А других проблем и задач хватает.
Сообщение автоматически объединено:

Маловероятно что кто-то будет переписывать их на AutoIt. Слишком много кода придется переписать...
На самом деле, не так много кода. Там половина кода за интерфейс отвечает.
У меня есть приложение на PureBasic считывающие информацию о диске в том числе смарт
Посмотрел, но ваше приложение не видит NVME диски и диски, которые вставлены через юсб карман. Предполагаю, что и через другие адаптеры не увидит.
В его исходном коде разобраться должно быть проще.
PureBasic для меня вообще темный лес. Если с Си хоть как-то знаком, то тут вообще НОЛЬ.
Но главное - судя по тому, как работает ваша программа, с теми её проблемами, что я озвучил выше, она не использует DeviceIOControl.
Сообщение автоматически объединено:

Слишком много кода придется переписать...
И если продолжать тему, то я ещё давал ссылку на виндовый учебник https://learn.microsoft.com/en-us/windows/win32/fileio/disk-management-control-codes
Тут расписаны почти все нужные команды. Ещё когда-то, пару лет назад, я находил их часть в описании autoit на буржуйском, но не осилил. Было бы прикольно, если бы в русской справке этот раздел был освещен более полно
Сообщение автоматически объединено:

О каком виртуальном копировании идет речь? Приложение читает и записывает данные на диск.
Чуть не забыл прокоментировать эти слова.
Если мы говорим про Cristal Disk Mark, то тут речь идет именно о том, что программа генерирует данные разных объемов (вроде бы до 5ГБ) и уже их копирует. Как назвать более правильно такой процесс, я не придумал )))
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
484
Репутация
57
Посмотрел, но ваше приложение не видит NVME диски и диски, которые вставлены через юсб карман.
В исходнике перечислены типы шин которые поддерживаются
Код:
#BusTypeScsi
#BusTypeAtapi
#BusTypeAta
#BusType1394
#BusTypeSsa
#BusTypeFibre
#BusTypeUsb
#BusTypeRAID
Да, среди них нет NVME, но с SATA SSD в том числе при подключении по USB, приложение считывает данные.
Если с Си хоть как-то знаком, то тут вообще НОЛЬ.
Можете справку посмотреть если хотите получше узнать https://www.upload.ee/files/13208679/Purebasic_v5.72_LTS_RU_Help.7z.html
Язык проще чем Си и немного похож на AutoIt.

Но главное - судя по тому, как работает ваша программа, с теми её проблемами, что я озвучил выше, она не использует DeviceIOControl.
В ней для всех запросов используется DeviceIOControl. Откройте файл Disks.pb из архива в моем предыдущем сообщении и в любом текстовом редакторе поищите слово DeviceIOControl. Найдется 12 совпадений.

речь идет именно о том, что программа генерирует данные разных объемов (вроде бы до 5ГБ) и уже их копирует.
Сгенерировать данные не сложно (в простейшем случае, заполнить массив данными функции Random()). Гораздо сложнее делать это в реальном времени при скорости записи несколько тысяч мегабайт в секунду, какая бывает у NVME SSD. Код должен выполнятся очень быстро и без многопоточности не обойтись. В этом плане AutoIt не подойдет - быстродействия не хватит.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
но с SATA SSD в том числе при подключении по USB, приложение считывает данные.
Не считывает. У меня такой на компе стоит. Он его видит, но смарт не показывает. Есть какая-то инфа, но её мало, типа серийник, подключено по юсб и ещё чего-то там.
Можете справку посмотреть если хотите получше узнать https://www.upload.ee/files/13208679/Purebasic_v5.72_LTS_RU_Help.7z.html
Язык проще чем Си и немного похож на AutoIt.
Может быть когда-нибудь. Но сейчас точно не до новых языков.
В ней для всех запросов используется DeviceIOControl. Откройте файл Disks.pb из архива в моем предыдущем сообщении и в любом текстовом редакторе поищите слово DeviceIOControl. Найдется 12 совпадений.
Возможно. Жаль, что у вас не реализован весь потенциал. Там можно определить и контроллер, и буфер, и тип памяти у ссд дисков. Не говоря уже про смарт. Я видел реализацию на С++. Там все это есть. Но исходников нет. А мне даже запомнить ничего не получилось. И к исходникам доступа уже нет.
в простейшем случае, заполнить массив данными функции Random())
Приблизительно так себе и представлял. Но генерировать файлы не умею ))) числа, там всякие слова, буквы в самом файле. Но файл. Да ещё определенного размера, к сожалению не умею. Да и где его складывать? Это ж все в оперативке крутится. И из оперативы пишется на диск.
Сообщение автоматически объединено:

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

Prog

Продвинутый
Сообщения
484
Репутация
57
Но генерировать файлы не умею
Заполняете массив случайными числами, записываете на диск и измеряете время за которое была произведена запись.

Кстати, не уверен, что нужна многопоточность.
Иначе не успеете сгенерировать поток данных 10 тысяч мегабайт в секунду (10 ГБ/с) для записи на дисик. Необходимо чтобы несколько потоков генерировали случайные данные, а один сохранял их на диск.
Если в одном потоке, тогда нужно по очереди сначала геренировать данные, после записать на диск. потом снова генерировать данные, после записывать на диск и так дальше. Не получится полностью загрузить даже SATA SSD не говоря про NVME.
И как я уже писал, это задача не для AutoIt. Он очень медленный и не поддерживает многопоточность.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Заполняете массив случайными числами, записываете на диск и измеряете время за которое была произведена запись.
Как дописать в конец файла понимаю ))) Но вряд ли текстовый файл на 5Гб сгенерится таким образом за 5 сек. А вот про отсутствие многопоточности косвенно говорит процесс загрузки дисков. Если, напр, отслеживать в диспетчере задач, то когда генерит файл на диск С, диск, куда записывается простаивает. Вот на скрине видны всплески и падения синхронно (обвел красным). И на самом деле на мой взгляд, тут и особо то многопоточность не нужна. Сгенерил и потом пиши на нужный диск, потом генери файл другого размера и опять пиши. В интерфейсе диск кристал диск марк так и делается. Сперва типа висит, ничего не делает секунд 5, но в этот момент загружен диск С. Потом показан процесс записи на целевой диск, и так с разным набором размеров файлов.
Только вот на самом деле файлы бывают разные: текстовые, медиа, базы данных и тп, в том числе в других программах генерят образ СД-диска. Я так и не понял, какие генерятся в кристал диск марк. А я пару лет назад делал генерацию текстовых файлов и потом их копирование. Даже тут на форуме есть тема, где я скрины под это дело пробовал использовать, сохранять их. Так файл на 5Гб генерился больше 5 сек ))) Может, конечно не так что-то делал. На самом деле не важно. Тут интересней понять, что за файлы генерит скристал диск марк. И как он их потом читает. Ведь он и скорость чтения меряет
Да и вообще, интересно, что за скорость он меряет. Это какая-то средняя, максимальная скорость? Или взята на каком-то отрезке?
Сообщение автоматически объединено:

Да, среди них нет NVME
Кстати, даже для развития вашего приложения на мой взгляд, было бы хорошо подсмотреть реализацию в Кристал диск инфо, потому что там программа работает с NVME и карманы юсб тоже читает хорошо. И масса других адаптеров через PCI и PCIe. Как у себя реализовал чтение с юсб карманов, уже не помню. У меня оставалась загвоздка в работе с NVME. Вот тогда и вычитал про ограниченность WMI и заточенность DeviceIOControl под такие запросы.
 

Вложения

  • запись на диск.jpg
    запись на диск.jpg
    210.1 КБ · Просмотры: 3
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,814
Репутация
1,170
А зачем генерировать файл? В принципе нет разницы какими данными писать, хоть нулями, всё равно не будет проверки писать ли ей нуль или пропустить потому что там нуль уже написан, думаю будет писать поверх не проверяя что на диске. Ну и по поводу зачем генерить файл, можно тупо открыть диск и прочитать первые 10 Гб данных от начала, или тупо забить файл нулями. Открыть файл на запись и пиши туда нули в цикле не создавая какой-то файл в памяти. Или открыть файл на 10 Мб, загрузив в память и циклично сбрасывать его данные в памяти на диск в открытый файл 1000 раз
Сообщение автоматически объединено:

если бы я успел, как и планировал, осилить Си/С++, то думаю и сам бы справился. НО это минимум год
Как я понимаю PureBasic легче Си/С++, но не уверен что за год можно освоить. Я начал осваивать PureBasic в 2018 году и пока не считаю себя свободно говорящим на PureBasic. Пока ещё я нахожу новые синтаксические конструкции, новые приёмы.
Если что Си/С++ vs PureBasic и комплект для PureBasic
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Как я понимаю PureBasic легче Си/С++, но не уверен что за год можно освоить. Я начал осваивать PureBasic в 2018 году и пока не считаю себя свободно говорящим на PureBasic. Пока ещё я нахожу новые синтаксические конструкции, новые приёмы
Совершенно согласен. Поэтому поясню, что я имел ввиду. Год - это минимум при плотном занятии для того, чтобы понять хоть что-то и теоретически разобраться, что написал другой человек. особенно, если интересует узконаправленная вещь. Не самому придумать аналогичное, а именно хоть немного разобраться. Я даже на autoit не особо свободно пишу/писал. Особенно с учетом того, что год назад за него последний раз садился. Но в чужом коде более менее разбираюсь. Но пробелов куча. Начиная с dll.
А зачем генерировать файл? В принципе нет разницы какими данными писать, хоть нулями
Я генерил ради интереса. Но генерил текстовый файл. До остальных руки не дошли и до сих пор не имею ни малейшего понятия как это делается.
А нужно только для того, чтобы понять, в чем же собственно разница между разными аналогичными программами. Скорость же меряют минимум 5 прог. И у всех разные результаты. Мне, напр, в отношении кристал диск марк интересно, есть ли при замере скорости учет буфера диска. Ну и не только это.
А для простоты сделал себе заготовку 4 каталога с разными объемами файлов. Выбрал каталог и сразу копирую. И не нужно 5-10 сек на генерацию.

Кстати, увидел, что вы меценат форума и в подписи у вас есть ссылки на русскую справку. Где-то в справке видел очень краткое описание работы в autoit с DeviceIOControl, но сейчас найти не могу. Хоть оно и очень краткое было. Меньше, чем на буржуйской справке.
А было бы прикольно, если бы на русском был сделан перевод этого раздела и дополнен примерами.
Сообщение автоматически объединено:

Или открыть файл на 10 Мб, загрузив в память и циклично сбрасывать его данные в памяти на диск в открытый файл 1000 раз
Кстати. Тут есть поправка. Один и тот же файл просто так скидывать нельзя. Нужно его переименовывать. А это тоже время, которое скажется на замере скорости записи и работы буфера диска.
 

AZJIO

Меценат
Меценат
Сообщения
2,814
Репутация
1,170
DyadyaGenya
1. Я только PureBasic`ом сейчас занимаюсь.
2. Открыть 10 Мб данных в память как указатель на бинарные данные и писать их 1000 раз в один файл в конец. Файл будет увеличиваться на 10 Мб при каждой итерации. По завершении закрыть файл. Можно по 100 Мб 100 раз.
3. Это сложный код, я пытался вырезать из него только температуру надеясь сократить, он просто перестал работать. Я хотел встроить температуру в ChkDskGui, хотя там это мало нужно но при компактном коде и стабильности я бы согласился добавить. Но не судьба.
4. Cristal Disk Info слишком крутая программа, кажущаяся простой на первый взгляд. там под каждый диск свои параметры. Считать некую бинарную информацию как смарт это одно, но каждый производитель диска под некоторые флаги описывает свои значения, что они означают. То есть человек именно заинтересован в правильной интерпретации параметров читая документацию для каждого диска. А там этих моделей не сосчитать, там в программе конфиги для каждого диска. Фактичеки это равносильно делать плагиат, беря конфиги автора.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
2. Открыть 10 Мб данных в память как указатель на бинарные данные и писать их 1000 раз в один файл в конец. Файл будет увеличиваться на 10 Мб при каждой итерации. По завершении закрыть файл. Можно по 100 Мб 100 раз
Это несколько другой принцип. В кристал диск марк, как и в других программах подобного типа, проверяется скорость на файлах одного размера. Тоесть, сперва пишутся скажем по 1Гб (или сколько ставят в настройках, напр, 5Гб), затем следующий проход. Вроде как есть 1Мб, 128Кб, 4КбВот только с потоками там не разобрался. Что там подразумевается под потоками записи. В любом случае,, в кристал диск марк типа записывается куча файлов, а не один расширяется. Тут даже для чтения этот один файл не получится использовать. Помню, когда стал разбираться с копированием, то и сам заметил, и многие люди отмечали, что при записи мелких файлов скорость снижается. А крупный файл пишется быстрее. Тоже и с чтением.
3. Это сложный код, я пытался вырезать из него только температуру надеясь сократить, он просто перестал работать. Я хотел встроить температуру в ChkDskGui, хотя там это мало нужно но при компактном коде и стабильности я бы согласился добавить. Но не судьба.
К сожалению, что-то меня на яндекс не пускает.
4. Cristal Disk Info слишком крутая программа, кажущаяся простой на первый взгляд. там под каждый диск свои параметры
Так я сам ещё в шапке темы написал, что если я правильно понимаю, то там есть настройки под каждого производителя. На самом деле это лишь настройки. Тут бы понять принцип запросов, а подрихтовать под каждый отдельный винт будет проще.
Фактичеки это равносильно делать плагиат, беря конфиги автора.
Программа лежит в открытом доступе. И даже если будет некоторый плагиат, в образовательных целях будет простительно. Я ж не для продажи хочу разобраться. Тут как минимум autoit для продаж не подходит ))) Тут более серьезный язык нужен для продаж. А вот для себя разобраться по идее думаю будет позволительно. Да и были у автора кристал диск ифно свои косяки в программе. Сходу не вспомню, но некоторые вещи через WMI отрабатывали правильнее. Это как с температурой (и не только с ней) в программе на форуме, которую мне предлагал [B]Glass4217[/B] как альтернативу.
но каждый производитель диска под некоторые флаги описывает свои значения, что они означают
По обычным дискам ssd и ide у меня наверное полный набор и я, если мне память не изменяет, даже где-то тут на форуме его публиковал. У меня пробел по дискам NVME. Кстати, точно, в кристал диск инфо на некоторых дисках проскакивали сообщения, что мол зарезервировано производителем, а у меня этот параметр в коллекции был. В смысле, его название. Конечно, у меня не такая коллекция дисков, как у автора кристал диск инфо, но под сотню будет. Так что было с чем сравнить.
Поэтому, думаю, тут особого плагиата не будет. А если есть на эту тему все таки какие-то сомнения, то можно разобраться с переделкой функций вот по этой справке: https://learn.microsoft.com/en-us/windows/win32/fileio/disk-management-control-codes
Она для того майкрософтом и выложена, чтобы ею пользовались и дотачивали под свои нужды.
У меня один из самых больших интересов в расшифровке кристал диск инфо, это то, как он определяет название контроллера диска. Я то научился определять любой контроллер. Даже когда то парсил все известные контроллеры и производители, не только под диск, но вообще, под все оборудование. Правда до ума не довел, не раскидал, где видушки, где флэшки, где что другое. Но файлик где-то валяется. Могу попробовать найти. И название сайта, откуда потянул данные.
 

Prog

Продвинутый
Сообщения
484
Репутация
57
только с потоками там не разобрался. Что там подразумевается под потоками записи.
Файл одновременно записывается несколько потоков данных.
В AutoIt из-за отсутствия многопоточности необходимо многоженство раз открыть файл с флагами FILE_SHARE_READ и FILE_SHARE_WRITE в асинхронном режиме (FILE_FLAG_OVERLAPPED).
При чтении и записи также нужно использовать асинхронные методы.

С многопоточностью проще. Создаем потоки в которых открываем файл для чтения и записи и с возможностью повторного открытия (FILE_SHARE_READ и FILE_SHARE_WRITE), а дальше читаем и пишем как обычно.

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

Тут даже для чтения этот один файл не получится использовать.
При линейном чтении, читаем файл сначала до конца. Если необходимый объем не прочитан, начинаем читать сначала. При случайном чтении, читаем блоки данных (обычно 4 КБ) по случайным позициям в файле.

Программа лежит в открытом доступе.
Посмотрите лицензию программы. Допускает ли она использование кода в других приложениях и не требуется ли при этом указывать первоисточник.
 

AZJIO

Меценат
Меценат
Сообщения
2,814
Репутация
1,170
DyadyaGenya
1. Причём тут много или мало файлов. Жёсткий диск не знает о том что в него пишут один и тот же файл 1000 раз. Блок данных в памяти, дескриптор открыт на один файл. Файловый буфер практически не участвует, так как он предотвращает многократное обращение к жёсткому диску, например 128 кб, то есть он сбрасывает на диск если размер данных превысил 128 кб. То есть если пишется 10 байтов, потом опять 10 байтов, то да будет писать в буфер, а 10 Мб ну ни как в буфере не поместится. Для жёсткого диска это будет как один сплошной поток данных, так как память ОЗУ быстрее чем память жёсткого диска и не получится ситуации когда диск будет ждать память, чтобы та ему дала очередной поток данных, скорее наоборот память ОЗУ будет ждать пока диск примет данные.
2. Непонятно зачем нужно писать в несколько потоков? Разве один поток не поставит жёсткий диск в раскоряку? Разме память ОЗУ работает медленнее любого жёсткого диска? Например я понимаю когда торрент качается в несколько потоков, создаётся выделенное место 4 гиг под файл, точнее создаётся файл и помечается торрентом как пустой, потому запрашивает с сидов скачать некий кусок данных и одновременно качает с нескольких человек допустим блоками по 2 Мб, как только блок закачен, он сбрасывается в файл по указанной позиции, тут суть в том что интернет медленнее жёсткого диска поэтому программа запрашивает куски данных с разных мест и качает их параллельно. Но повторюсь память ОЗУ быстрее жёсткого диска. Остаётся предположить что NVME диск может писать данные в несколько потоков (при условии что NTFS это поддерживает), погуглил, пока не нашёл такую возможность, по крайней мере шпидельные пишут в один поток, даже если файлы пишутся одновременно, на деле это чередующаяся запись то одного файла, то другого пока его дескриптор открыт и кстати приводящая к дефрагментации файлов на диске, именно поэтому Linux при копировании фильма если начать копировать второй файл, то он ставит его в очередь и начнёт писать только тогда когда закончит с первым.
3. ChkDskGui (там скриншот, может этого достаточно)
Сообщение автоматически объединено:

Посмотрел, там лицензия MIT, можно хоть что делать, хоть продавать. Но при этом добавлено
Вышеприведенное уведомление об авторских правах и это уведомление о разрешении должны быть включены во все
копии или существенные части Программного обеспечения.
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Непонятно зачем нужно писать в несколько потоков?
Возможно я чего-то не понимаю, но вроде как в настройках кристал диск марк такое есть. Вот тут что-то было про настройку потоков: https://crystalmark.info/en/software/crystaldiskmark/crystaldiskmark-main-menu/
На самом деле этот вопрос вытекает из того, что может ли что-то подобное сделать autoit. Многопоточность обсуждалась выше, типа было предположение, что кристал диск марк делает это в многопоточном режиме, а autoit на такое не заточен. А я предполагаю, что вряд ли кристал диск марк работает в многопоточном режиме, хотя какие-то настройки у него для этого есть.
а 10 Мб ну ни как в буфере не поместится. Для жёсткого диска это будет как один сплошной поток данных, так как память ОЗУ быстрее чем память жёсткого диска и не получится ситуации когда диск будет ждать память, чтобы та ему дала очередной поток данных, скорее наоборот память ОЗУ будет ждать пока диск примет данные.
И да, и нет. Многие диски, особенно NVME имеют буфер в несколько ГБ. У некоторых даже несколько десятков ГБ. Причем память на них что-то типа ддр3. Смотрел по маркировке. Сейчас точно не скажу, не помню.
Посмотрел, там лицензия MIT, можно хоть что делать, хоть продавать. Но при этом добавлено
Думаю, что добавить такие слова будет легко, если кто-то задумает на его основе сделать реально программу и выложить в открытый доступ. А если кто-то лично для себя будет использовать, то может и в надписи не будет необходимости. Тем более, повторюсь, поскольку я не знаю Си/С++ мне тяжело судить насколько сильно ушел от оригинала (тоесть статьи майкрософта) автор кристал диск инфо. По идее и на основе этой статьи можно написать нечто подобное. Тут скорее где-то бы узнать спецификацию производителей для NVME. Для других дисков у меня есть. Но даже для NVME сейчас стандартизируют, отличаются только командами по работе с диском, но смарт сейчас у всех одинаковый.
3. ChkDskGui (там скриншот, может этого достаточно)
Выглядит прикольно. Как я понял, в неё даже некоторый чекдиск есть, типа исправлять битые сектора. Но для меня это излишне. Проверять бэды пока желания нет. Только смарт, контроллер, буфер, тип памяти, число банок, скорость.
Все остальное может быть потом.
Кстати, увидел в вашей программе, что вы вроде как именно эти характеристики и не затрагиваете. Хотя может где-то на другой вкладке они есть
Причём тут много или мало файлов. Жёсткий диск не знает о том что в него пишут один и тот же файл 1000 раз
Диск не знает. Файловая система знает. Один и тот же файл записать несколько раз в одно и тоже место разве можно записать? Насколько я знаю, только в том случае, если название будет другое или расширение поменяете, что равносильно переименованию. А вот уже чтение файловой системы и файла снижает скорость. Попробуйте скопировать один файл на 1Гб, потом сделайте каталог из файла по 1Кб, только с разными именами и сно в общей сумме на 1Гб и скопируйте этот каталог. А потом сделайте копирование 1 файла на 1Кб, но в процессе хотя бы автоматом переименовывайте его, и так, пока в каталоге назначения не будет 1Гб. Скорость будет сильно отличаться во всех трех случаях.
При этом, если вы будете писать, вернее дописывать в открытый файл скажем по 1Кб строку в конец файла, так это будет уже 4-я скорость.
Сообщение автоматически объединено:

В AutoIt из-за отсутствия многопоточности необходимо многоженство раз открыть файл с флагами FILE_SHARE_READ и FILE_SHARE_WRITE в асинхронном режиме (FILE_FLAG_OVERLAPPED).
При чтении и записи также нужно использовать асинхронные методы.

С многопоточностью проще. Создаем потоки в которых открываем файл для чтения и записи и с возможностью повторного открытия (FILE_SHARE_READ и FILE_SHARE_WRITE), а дальше читаем и пишем как обычно.
Спасибо, буду иметь ввиду на будущее
В нем запись в один файл
А как вы это определили?
При линейном чтении, читаем файл сначала до конца. Если необходимый объем не прочитан, начинаем читать сначала. При случайном чтении, читаем блоки данных (обычно 4 КБ) по случайным позициям в файле.
Может быть для чтения и пойдет. Но для записи точно один файл не пойдет. Выше я пояснял разницу скорости записи одного файла и кучи, в том числе и тыщу раз записать один и тот же файл, переименовывая его на ходу.
 

Prog

Продвинутый
Сообщения
484
Репутация
57
Разве один поток не поставит жёсткий диск в раскоряку?
Многопоток актуален для SSD и небольших объемов данных. Этим тестируют SSD насколько он быстро читает и пишет мелкие файлы от множества приложений (винда многозадачна и одновременно несколько приложений могут читать или писать на диск).

Файловый буфер практически не участвует
Файловый буфер может быть почти на весь объем свободного ОЗУ. В диспетчере задач это память обозначенная как Кэшировано.

Остаётся предположить что NVME диск может писать данные в несколько потоков
Непосредственно на flash пишет в один поток, но одновременно могут записывать несколько приложений.

Многие диски, особенно NVME имеют буфер в несколько ГБ. У некоторых даже несколько десятков ГБ.
У каких несколько десятков ГБ? Может перепутали с SLC кешем?
Сейчас все чаще встречаются без ОЗУ буфера.

А как вы это определили?
Элементарно Ватсон!
Crystal Disk Mark создает папку на диске, а в ней файл.
Также за тем что пишет приложение можно наблюдать в мониторе ресурсов.

Но для записи точно один файл не пойдет.
Понаблюдайте за записью Crystal Disk Mark и убедитесь что я прав.
Если копировать файлы как предлагаете вы, скорость будет ниже из-за необходимости чтения файла с диска и поиска свободного места на диске в файловой системе.
Когда файл создан и его размер не меняется, все перечисленное не влияет на результат.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Файловый буфер может быть почти на весь объем свободного ОЗУ. В диспетчере задач это память обозначенная как Кэшировано
Как бы знал об этом, но вот в диспетчере задач не знал. Запустил у себя и так и не понял, где это. Вернее "кешировано" у меня одно и тоже число, не зависимо от того идет копирование или нет.
У каких несколько десятков ГБ? Может перепутали с SLC кешем?
Сейчас все чаще встречаются без ОЗУ буфера.
Сейчас на всем экономят. К сожалению не помню, что за диск попался на пару десятков Гб, вроде не самсунг самсунг был, а что-то типа xpg, но не уверен. Дорогие не могу у себя оставить, только бюджетники, ну или середнячки. Из них есть у пары вроде бы до 10Гб. Но обычно на 1Гб или полное отсутствие. К тому же я смотрю на чипы. Ведь есть память под флэш, а есть под буфер, хоть и далеко не у всех. И это одна из причин, почему хотелось бы разобраться с кристал диск инфо. Не хочется вскрывать диски, отклеивать наклейки, терять гарантию. И хоть кристал диск инфо не показывает какой буфер, но вдруг на его основе пойму, как работать с этим DeviceIOControl. Он точно эту инфу вытягивает. Ведь и с оперативкой так же работает, вплоть до определения проивзодителя конкретной банки памяти и её серийного номера (вроде бы).
Понаблюдайте за записью Crystal Disk Mark и убедитесь что я прав.
Возможно так работает кристал диск марк. Но вот тут как раз и есть проблема. Он не показывает какую-то скорость. Он показывает каких-то попугаев. И конечно скорость будет отличаться. И это хорошо. Ведь в реальной жизни обычно копируют кучу разных файлов. А в кристал диск марк - синтетика.
Элементарно Ватсон!
Crystal Disk Mark создает папку на диске, а в ней файл.
Также за тем что пишет приложение можно наблюдать в мониторе ресурсов.
Да уж, как-то не подумал. Там реально один файл темп. В таком случае вообще не понимаю, что этот диск марк меряет. Вернее зачем так.
Если копировать файлы как предлагаете вы, скорость будет ниже из-за необходимости чтения файла с диска и поиска свободного места на диске в файловой системе.
А вот тут и есть причина, почему есть мысли загонять в виртуалку, а не на диск. С оперативы все таки быстрее записывать. Можно и очень скоростные диски для этого использовать, у которых скорость чтения огромная, но как тестить их?
 

AZJIO

Меценат
Меценат
Сообщения
2,814
Репутация
1,170
DyadyaGenya
Файловая система знает что в конец файла дописываются данные. Можно создать один файл большого размера, поставить указатель в начало и писать в файл. Про много файлов тут ситуация, что системе ещё надо писать в MFT, то есть создавать очередной узел-таблицу и записывать в неё имена файлов, атрибуты и адреса. Конечно это не тоже самое что последовательно друг за другом писать данные в сравнении с остановками и записями в MFT.
Я не представляю как один файл писать в многопоточном режиме, пока один поток пишет второй ждёт своей очереди?
ChkDskGui лишь запускает системную утилиту ChkDsk, добавив ключи.

Prog
Если взять шпидельный диск, то головка то одна, она не может сразу везде писать. Даже если там несколько блинов, как я понимаю она всё равно позиционирует одну из них, а даже если бы писали сразу 4 головки, они всё равно будут писать один поток. Если бы каждая была самостоятельная, только тогда можно было бы писать в 2 или 4 потока. Как пишет SSD я не в курсе. Ну и у нас имеется шина данных 7 контактов, каждая ли на поток или по 2 на поток или это всё один поток, а другие пустышки или технические, не знаю, гугл понятных объяснений не даёт.
 

Prog

Продвинутый
Сообщения
484
Репутация
57
Я не представляю как один файл писать в многопоточном режиме, пока один поток пишет второй ждёт своей очереди?
Да, но это решается на уровне системы и контроллера SSD. Чем эффективнее работает контроллер и flash память, тем быстрее потоки получат запрошенные данные, а значит скорость чтения и записи выше.

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

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Судя по тому, что идет обсуждение, тема все таки хотя бы пару человек заинтересовала. Это радует
Но тогда нужно разбить вопрос на две части:
1. То как я вижу работу аналогичной программы, которую хотелось бы иметь на руках. Естественно с учетом всех советов. Потому что важно и то, как это видите вы.
2. То, как реализован механизм того же копирования в кристал диск.
И понять, что мы все таки хотим )))
1. Отговорить меня писать на autoit и не подсматривать для этого в кристал диск
2. Только скопировать (полностью сплагиатить) механизм работы кристал диск. Только тогда понять для чего и как потом это применять.
3. Придумать свой механизм тестирования дисков, может быть подсмотрев что-то в кристал диск.
В теме речь об SSD и о том насколько он эффективно может обрабатывать множество запросов
На самом деле в теме нет ограничений о версии диска. Это и шпиндельные и ssd диски. Да, у них могут быть разные принципы записи, даже среди ссд. Ведь nvme тоже ссд, но могут писать в несколько потоков, а вот обычные ссд не все могут. И это зависит от контрллера (как я понимаю).
Про много файлов тут ситуация, что системе ещё надо писать в MFT, то есть создавать очередной узел-таблицу и записывать в неё имена файлов, атрибуты и адреса. Конечно это не тоже самое что последовательно друг за другом писать данные в сравнении с остановками и записями в MFT.
Так и я о том же. Только вы выразились более правильно. Если честно, когда перестаешь заниматься какой-то темой, особенно, если и не особо то и разбирался, то многие вещи/термины забываются. Принцип работы остается в голове, а нюансы забываются. Так что вы выразили мою мысль более правильно.
Но тут вопрос даже не в том.
Если бы я писал программу, то я бы тестировал скорость и так, и так. Потому что ситуации в жизни бывают разные. Смотришь рекламу какого-то диска, у него скорости заявлены просто сногсшибательные. А доходит до дела, он начинает в некоторых случаях проседать. Это и от буфера зависит (физический или slc)и даже от температуры, не говоря уже о контроллере. Те же шпиндельные диски имеют разный буфер. А вот кристал диск инфо выше 32Мб у шпиндельных их не видит А у моего буфер на 512мб. При этом даже производитель не пишет об этом. Только если специально копаться в инфе можно найти реальные значения. А у ссд дисков кристал диск инфо вообще не видит буфер. В упор не понимаю почему. Кстати, в wmi по этому поводу тоже для ссд не нашел функции/метода. Только если через DeviceIOControl.
Я уж не говорю о ситуации, когда один и тот же производитель в одну и ту же модель ставит разную память и даже не удосуживается об этом предупредить покупателей. А подделки вообще отдельный разговор. Скорость работы, тоесть записи/чтения у дисков с разной памятью может сильно отличаться.
Поэтому на мой взгляд, нужна программа, которая с помощью DeviceIOCOntrol вытянет всю инфу по любому диску и даже тип памяти, и довесок к ней, который тестирует скорость в различных режимах: запись в конец файла, запись одного большого файла, запись кучи мелких файлов и тп варианты. Да ещё и желательно все это загнать в ОЗУ, чтоб быстрее читалось.
Сам я это в ближайшее время точно не сделаю. У вас у всех опыта больше, чем у меня. У вас такая возможность и знания есть.
И кроме написания такой программы сперва на autoit, затем на любом удобном для каждого языке, есть ещё дополнительный выигрыш от этого - дополнить пробел в русской справке, да ещё с примерами.
Так что двойная выгода получается.
Ну и могу пример того, что тип памяти определяется привести:
 

Вложения

  • phison_flash_id.txt
    3.3 КБ · Просмотры: 1
Верх